web-dev-qa-db-de.com

Inverses Attribut in NHibernate

Wie verwende ich das Inverse-Attribut? Wenn ich mich nicht irre, muss für eine bis viele Beziehungen das inverse Attribut auf true gesetzt werden. Für viele-zu-viele-Beziehungen muss eines der inversen Attribute der Entitätsklasse auf true und ein anderes auf false festgelegt werden.

Kann jemand Licht ins Dunkel bringen?

87
Graviton

Das inverse Attribut darf nicht auf true gesetzt werden ...

Mit dem inversen Attribut geben Sie den Eigentümer der Assoziation an. (Eine Assoziation kann nur einen Eigentümer haben, daher muss ein Ende auf "invers" und das andere auf "nicht invers" eingestellt sein.) (Inhaber: inverse=false; Nicht-Besitzer: inverse=true)

Wenn Sie in einer Eins-zu-Viele-Zuordnung die Auflistung nicht als invers kennzeichnen, führt NHibernate ein zusätzliches UPDATE durch. In diesem Fall fügt NHibernate zuerst die Entität ein, die in der Auflistung enthalten ist, fügt ggf. die Entität ein, die die Auflistung besitzt, und aktualisiert anschließend die "Auflistungsentität", sodass der Fremdschlüssel und die Zuordnung festgelegt werden gemacht wird. (Beachten Sie, dass dies auch bedeutet, dass der Fremdschlüssel in Ihrer Datenbank nullfähig sein sollte.).

Wenn Sie das Ende der Auflistung als "invers" markieren, behält NHibernate zuerst die Entität bei, die die Auflistung "besitzt", und behält danach die Entitäten in der Auflistung bei, wobei eine zusätzliche UPDATE-Anweisung vermieden wird.

In einer bidirektionalen Assoziation haben Sie also immer ein inverses Ende.

121

Zusätzlich zu die Antwort oben und nach meinem Verständnis müssen Sie den Fremdschlüsselwert in der Auflistung manuell beibehalten, das heißt, wenn Sie die zusätzliche Update-Anweisung nicht möchten:

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);

weitere Erläuterungen zum inversen Attribut finden Sie in folgendem Beitrag:

http://www.emadashi.com/index.php/2008/08/nhibernate-inverse-attribute/

10
Emad Alashi

Ich kann sehen, wo der "Eigentümer" hereinkommt, aber eine Assoziation ist eine Pipe, und Sie können nach unten schauen, was also zu sagen ist, welche Entität die Pipe "besitzt".

Eine andere Sichtweise ist, dass in einer Eins-zu-Viele-Beziehung tatsächlich zwei Beziehungen bestehen.

Beziehung 1: Eltern für viele Kinder.

Beziehung 2: Jedes Kind zu einem Elternteil

Daher wird NH versuchen, sql auszuführen, um diese in der Datenbank zu speichern. Dies ist jedoch nicht erforderlich, da beim Festlegen des Fremdschlüssels z. Wenn in Beziehung 2 ein Kind gespeichert ist, hat es automatisch auch die Beziehung eines Elternteils zum Kind festgelegt, da Beziehung 1 das "Gegenteil" von Beziehung 2 ist.

Umgekehrt bedeutet das, dass wir es standardmäßig erhalten, sobald wir die Hauptbeziehung festgelegt haben. d.h. es ist nicht erforderlich, dass NH SQL ausführt, um Beziehung 1 zu reparieren, und durch Markieren der untergeordneten Auflistung als Inverse NH wird die Ausführung von SQL übersprungen, wenn die untergeordnete Auflistung hinzugefügt wird.

Ich nehme an, wenn Sie NH nicht mitteilen, dass es sich um eine Inverse handelt, wäre es mühsam, SQL auszuführen, um zu versuchen, die inverse Beziehung ebenfalls einzurichten - auch wenn dies nicht erforderlich war.

2
Mickey Puri