Обратный атрибут в NHibernate - PullRequest
85 голосов
/ 03 апреля 2009

Как использовать обратный атрибут? Если я не ошибаюсь, для одного-многих отношений обратный атрибут должен быть установлен в true. Для отношений «многие ко многим» один из обратных атрибутов класса сущностей должен иметь значение «истина», а другой - «ложь».

Кто-нибудь может пролить свет на это?

Ответы [ 3 ]

119 голосов
/ 03 апреля 2009

Обратный атрибут не должен быть установлен в true ...

Вы используете обратный атрибут, чтобы указать «владельца» ассоциации. (У ассоциации может быть только один владелец, поэтому один конец должен быть установлен как обратный, а другой должен быть установлен как «не обратный»). (Владелец: inverse=false; Не владелец: inverse=true)

В связи один-ко-многим, если вы не пометите коллекцию как обратную сторону, тогда NHibernate выполнит дополнительное ОБНОВЛЕНИЕ. Фактически, в этом случае NHibernate сначала вставит сущность, которая содержится в коллекции, при необходимости вставит сущность, которая владеет коллекцией, а затем обновит «сущность коллекции», чтобы установить внешний ключ и установить связь сделан. (Обратите внимание, что это также означает, что внешний ключ в вашей БД должен иметь значение NULL).

Когда вы помечаете конец коллекции как «обратный», тогда NHibernate сначала сохраняет сущность, которая «владеет» коллекцией, и впоследствии сохраняет сущности, которые находятся в коллекции, избегая дополнительного оператора UPDATE.

Итак, в двунаправленной ассоциации у вас всегда есть один обратный конец.

9 голосов
/ 19 июня 2009

В дополнение к ответу выше , и, насколько я понимаю, вам нужно сохранить значение внешнего ключа в коллекции вручную, то есть, если вы не хотите использовать дополнительный оператор обновления:

Parent par = Session.Get<Parent>(8);

Child ch = new Child();
ch.Name = "Emad";

//set the parent foreign key manually
ch.MyParent = par;

par.MyChildren.Add(ch);
Session.Save(par);

для дальнейшего объяснения обратного атрибута, проверьте следующий пост:

http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/

2 голосов
/ 15 октября 2011

Я вижу, где появляется «владелец», но ассоциация - это труба, и вы можете посмотреть с любого конца, так что же сказать, какая сущность «владеет» каналом.

Другой взгляд на это заключается в том, что в отношениях «Один ко многим» на самом деле происходит 2 отношения.

Отношение 1: родитель для многих детей.

Отношение 2: каждый ребенок к родителю

Так что NH попытается запустить sql для хранения каждого из них в БД. Но это не нужно, потому что при установке внешнего ключа, например, в отношениях 2, когда ребенок хранится, он автоматически фиксирует отношение родителя к ребенку, потому что отношение 1 является «обратным» в отношении 2.

Таким образом, обратное означает, что это то, что мы получаем по умолчанию, как только мы установили основные отношения. то есть нет необходимости, чтобы NH запускал sql для исправления Отношения 1, и, пометив дочернюю коллекцию как Инверсионный NH, пропустит запуск sql при добавлении дочерней коллекции.

Я бы предположил, что если вы не скажете NH, что это обратное, то потратите усилия на создание sql, чтобы попытаться установить и обратные отношения - даже если это не нужно.

...