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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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/

Ответ 3

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

Другим способом взглянуть на это является то, что в отношениях от одного до многих существует фактически 2 отношения.

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

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

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

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

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