Зворотний атрибут у NHibernate


89

Як використовувати зворотний атрибут? Якщо я не помиляюся, для відношення один до багатьох зворотний атрибут повинен бути встановлений як true. Для взаємозв’язків багато-до-багатьох один із зворотних атрибутів класу сутності має бути встановлений у значення true, а інший - у значення false.

Хто-небудь може пролити на це світло?


2
Ви також можете перевірити мою відповідь " Коли використовувати inverse =" true | false " ", на подібне питання.
Даніель Шиллінг,

Відповіді:


125

Обернений атрибут не повинен мати значення true ...

Ви використовуєте зворотний атрибут, щоб вказати "власника" асоціації. (У асоціації може бути лише один власник, тому для одного кінця потрібно встановити зворотний, для іншого - "не зворотний"). (Власник: inverse=false; Non-власник: inverse=true)

Якщо ви не позначите колекцію як зворотний кінець, в асоціації один-до-багатьох, NHibernate виконає додаткове ОНОВЛЕННЯ. Насправді, у цьому випадку NHibernate спочатку вставляє сутність, що міститься в колекції, при необхідності вставляє сутність, що є власником колекції, а потім оновлює "сутність колекції", так що встановлюється зовнішній ключ і асоціація зроблено. (Зверніть увагу, що це також означає, що зовнішній ключ у вашій БД повинен мати нульовий статус).

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

Отже, у двонаправленій асоціації у вас завжди є один зворотний кінець.


4
Це пояснює все, що просто додати власника - це той, у
котрому

48
На мій погляд, це дійсно погана термінологія. Чому б не позначити право власності, а не "зворотне" ?!
UpTheCreek

1
+1 за використання заперечення для вже запереченого терміна :) "Атрибут INVERSE НЕ ПОВИНЕН бути встановлений як true"
contactmatt

Гарна відповідь, залишається лише питання, як вирішити, хто повинен бути "власником"
PandaWood

Що можна сказати про багато-до-багатьох, коли у вас є середня таблиця, яка містить зв'язок між 2 сутностями?
Dark_Knight

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.