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?

Graviton
quelle
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.

Frederik Gheysels
quelle
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/

Emad Alashi
quelle
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.

Mickey Puri
quelle