Inverses Attribut in NHibernate


89

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 gesetzt werden.

Kann jemand Licht ins Dunkel bringen?


2
Sie können auch meine Antwort " Wann inverse =" true | false "verwenden " auf eine ähnliche Frage überprüfen .
Daniel Schilling

Antworten:


125

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

Sie verwenden das inverse Attribut, um den 'Eigentümer' der Zuordnung anzugeben. (Eine Zuordnung kann nur einen Eigentümer haben, daher muss ein Ende auf invers gesetzt werden, das andere muss auf "nicht invers" gesetzt werden.) (Besitzer: inverse=false; Nichteigentümer: inverse=true)

Wenn Sie in einer Eins-zu-Viele-Zuordnung die Sammlung nicht als inverses Ende markieren, führt NHibernate ein zusätzliches UPDATE durch. In diesem Fall fügt NHibernate zuerst die Entität ein, die in der Sammlung enthalten ist, und fügt bei Bedarf die Entität ein, der die Sammlung gehört, und aktualisiert anschließend die 'Sammlungsentitä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 nullwertfähig sein sollte.)

Wenn Sie das Sammlungsende als "invers" markieren, behält NHibernate zuerst die Entität bei, die die Sammlung "besitzt", und behält anschließend die Entitäten bei, die sich anschließend in der Sammlung befinden, wobei eine zusätzliche UPDATE-Anweisung vermieden wird.

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


4
Dies erklärt alles, nur um Eigentümer hinzuzufügen, ist einer, der Fremdschlüssel in der Tabelle hat
Brijesh Mishra

47
Meiner Meinung nach ist das eine wirklich schlechte Terminologie. Warum nicht eher das Eigentum als das "Inverse" markieren?!
UpTheCreek

1
+1 für die Verwendung der Negation für einen bereits negierten Term :) "Das INVERSE-Attribut darf NICHT auf true gesetzt werden"
contactmatt

Gute Antwort, die einzige Frage ist, wie man entscheidet, wer der "Besitzer" sein soll
PandaWood

Was ist mit vielen zu vielen, wenn Sie eine mittlere Tabelle haben, die die Beziehung zwischen zwei Entitäten enthält?
Dark_Knight

10

Zusätzlich zu der obigen Antwort und nach meinem Verständnis müssen Sie den Fremdschlüsselwert in der Auflistung manuell beibehalten, wenn Sie die zusätzliche Aktualisierungsanweisung 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 im folgenden Beitrag:

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


2

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

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

Beziehung 1: Eltern vieler 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. B. in Beziehung 2, wenn ein Kind gespeichert wird, automatisch auch die Beziehung eines Elternteils zum Kind festgelegt wird, da Beziehung 1 die "Umkehrung" von Beziehung 2 ist .

Invers bedeutet also, dass es etwas ist, das wir standardmäßig erhalten, sobald wir die Hauptbeziehung festgelegt haben. Das heißt, es ist nicht erforderlich, dass NH SQL ausführt, um Beziehung 1 zu reparieren. Wenn Sie die untergeordnete Sammlung als inverse NH markieren, wird das Ausführen von SQL übersprungen, wenn die untergeordnete Sammlung hinzugefügt wird.

Ich würde annehmen, wenn Sie NH nicht sagen würden, dass es sich um eine Umkehrung handelt, würde es Mühe verschwenden, SQL zu verwenden, um zu versuchen, auch die Umkehrungsbeziehung herzustellen - obwohl dies nicht erforderlich war.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.