Свободное владение nHibernate - PullRequest
4 голосов
/ 15 июня 2011

У меня есть объект, который отображается в таблицу с именем Rule. Таблица для этого объекта имеет FK для другой таблицы с именем Category. Я пытаюсь выяснить, как получить свойство из категории в моей сущности правила. Я почти уверен, что хочу использовать соединение в моем сопоставлении сущностей, но я не могу понять, как настроить его так, чтобы оно работало. Вот мое отображение:

Join("Category", x => 
{
    x.Map(i => i.CategoryName, "Name");
    x.KeyColumn("CategoryId");
    x.Inverse();
});

Вот SQL, который он генерирует ...

SELECT ...
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.Id=rules0_1_.CategoryId
WHERE ...

Вот SQL, который я хочу.

SELECT ...
FROM Rule rules0_ left outer join Category rules0_1_ on rules0_.CategoryId=rules0_1_.Id
WHERE ...

Кажется, я не могу найти в JoinPart ничего, что позволило бы мне это сделать. Subselect выглядит многообещающе из небольшой части документации, которую я нашел, но я не могу найти никаких примеров того, как ее использовать. Любой совет по этой проблеме будет высоко ценится. Спасибо!

1 Ответ

6 голосов
/ 15 июня 2011

«Присоединиться» плохо названо.«соединение» в отображении NHibernate подразумевает отношение «ноль к одному», основанное на отношении первичных ключей двух таблиц.Вы бы использовали объединение, если, например, у вас есть таблица User и таблица UserAdditionalInfo, с нулем или одной записью на пользователя.Таблица UserAdditionalInfo, скорее всего, будет ссылаться на PK от пользователя как на внешний ключ, так и на собственный первичный ключ.Этот тип вещей является обычным делом, когда администратору базы данных приходится религиозно поддерживать схему для унаследованного приложения, но более новому приложению нужны новые поля для той же концептуальной записи.где запись имеет отношение внешнего ключа к нулю или к одной другой записи.Вы бы легко настроили его так:

References(x=>Category)
    .Column("CategoryId")
    .Inverse()
    .Cascade.None();

Проблема в том, что категория должна теперь отображаться;это отдельная сущность, которая теперь связана с вашей.Ваши варианты - жить с этой моделью, «сгладить» ее, сделав ссылку на сущность частной, изменив отображение для доступа к сущности как таковой и кодируя «сквозные» свойства, которые вы хотите сделать общедоступными, или используя кодинструмент, подобный AutoMapper, для проецирования этой глубокой доменной модели в плоский DTO во время выполнения для общего использования.У всех есть свои плюсы и минусы.

...