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


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

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

3 85

3 ответа:

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

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

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

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

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

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

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 и, отметив коллекцию children как обратную NH, пропустит запуск sql, когда коллекция children будет добавлена.

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