Как использовать обратный атрибут? Если я не ошибаюсь, для отношений один ко многим обратный атрибут должен иметь значение true. Для отношений «многие ко многим» один из обратных атрибутов класса сущности должен иметь значение true, а другой - false.
Кто-нибудь может пролить свет на это?
nhibernate
nhibernate-mapping
Гравитон
источник
источник
Ответы:
Обратный атрибут не должен иметь значение true ...
Вы используете обратный атрибут, чтобы указать «владельца» ассоциации. (У ассоциации может быть только один владелец, поэтому один конец должен быть установлен как инверсный, а другой - как «не инверсный»). (Владелец:
inverse=false
; Non-владелец:inverse=true
)В ассоциации «один ко многим», если вы не отметите коллекцию как обратную, NHibernate выполнит дополнительное ОБНОВЛЕНИЕ. Фактически, в этом случае NHibernate сначала вставит сущность, которая содержится в коллекции, при необходимости вставит сущность, которая владеет коллекцией, а затем обновит «сущность коллекции», чтобы внешний ключ был установлен, а ассоциация сделан. (Обратите внимание, что это также означает, что внешний ключ в вашей БД должен допускать значение NULL).
Когда вы помечаете конец коллекции как «обратный», тогда NHibernate сначала сохранит сущность, которая «владеет» коллекцией, а затем сохранит сущности, находящиеся в коллекции, избегая дополнительного оператора UPDATE.
Итак, в двунаправленной ассоциации у вас всегда есть один обратный конец.
источник
В дополнение к приведенному выше ответу и, насколько я понимаю, вам необходимо вручную сохранить значение внешнего ключа в коллекции, то есть если вам не нужен дополнительный оператор обновления:
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 отношения.
Отношения 1: Многодетный родитель.
Отношение 2: каждый ребенок к родителю
Таким образом, NH попытается запустить sql для сохранения каждого из них в БД. Но в этом нет необходимости, потому что, когда вы устанавливаете внешний ключ, например, в отношении 2, когда сохраняется дочерний элемент, он также автоматически фиксирует отношение родителя к дочернему, потому что отношение 1 является «инверсией» отношения 2 .
Таким образом, инверсия означает, что это то, что мы получаем по умолчанию после того, как установили основные отношения. то есть NH не нужно запускать sql для исправления Отношения 1, и, помечая дочернюю коллекцию как инверсную, NH пропустит запуск sql при добавлении дочерней коллекции.
Я предполагаю, что если вы не скажете NH, что это обратная связь, тогда он потратит усилия на выполнение sql, чтобы попытаться установить обратную связь, хотя в этом и не было необходимости.
источник