Обратный атрибут в NHibernate


89

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

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


2
Вы также можете проверить мой ответ " Когда использовать inverse =" true | false " " на аналогичный вопрос.
Дэниел Шиллинг

Ответы:


126

Обратный атрибут не должен иметь значение true ...

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

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

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

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


4
Это объясняет, что все, что нужно добавить, - это тот, у кого есть внешний ключ в таблице
Бриджеш Мишра,

48
На мой взгляд, это действительно плохая терминология. Почему бы не отметить собственность, а не «обратное» ?!
UpTheCreek

1
+1 за использование отрицания для уже отрицаемого термина :) «Атрибут INVERSE НЕ ДОЛЖЕН быть установлен в значение true»
contactmatt 08

Хороший ответ, единственный вопрос, который остается, - как решить, кто должен быть «владельцем»
PandaWood

А как насчет «многие ко многим», когда у вас есть средняя таблица, в которой хранятся отношения между двумя объектами?
Dark_Knight 09

10

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

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

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

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

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.