2009-07-19 8 views

Antwort

67

Kapitel 9 deckt all dies besser als ich es kann:

http://nhibernate.info/doc/nh/en/index.html

Aber Klippe Hinweise:

Save() nimmt ein neues Objekt ohne eine Kennung und legt es auf der Sitzung. Das Objekt wird INSERT 'd.

Update() nimmt ein vorhandenes Objekt, das einen Bezeichner hat, aber nicht in der Sitzung ist, und hängt es an die Sitzung an. Das Objekt wird UPDATE 'd.

SaveOrUpdate() schaut sich den Bezeichner an und entscheidet, was im obigen notwendig ist.

SaveOrUpdateCopy() ist etwas Besonderes in dem sagen, Sie haben zwei Objekte mit der gleichen Kennung - eine in der Sitzung und eine nicht. Wenn Sie versuchen, und update derjenige, der nicht in der Sitzung ist, wird eine Ausnahme normal ausgelöst (Sie versuchen nun, zwei Objekte anzuhängen, die dasselbe persistente Objekt für die Sitzung darstellen). SaveOrUpdateCopy() kopiert den Nicht-Sitzungsobjektstatus in den Sitzungsobjektstatus.

Ich bin mir nicht sicher, wie Sie NH verwenden werden, aber für viele Fälle brauchen Sie nur Save(). Die Sitzung macht die ganze Arbeit notwendig, um zu wissen, was aktualisiert werden muss und einfach Flush() oder Commit() tut alles, was Sie brauchen.

+2

Normalerweise benötigen Sie SaveOrUpdate() nicht, da NHibernate Änderungen an jedem geladenen Objekt verfolgt. Um ein Objekt zu aktualisieren, benutze Session.Get(), ändere dann und rufe dann Session.Flush() auf. –

+0

Was ist besser lesbar oder Absicht in den Code dann offen: 'SaveOrUpdate()' oder 'Flush()'/'Commit()'? Oder macht es keinen Unterschied (semantisch oder anders)? –

+0

Das explizite Löschen der Sitzung ist wahrscheinlich nicht erforderlich. Wenn Sie eine Transaktion festschreiben oder die Sitzung den Gültigkeitsbereich verlässt, werden die Änderungen automatisch beibehalten (oder früher, wenn sie aus irgendeinem Grund erforderlich sind, ID-Generierung oder Ähnliches). Flush ist die Absicht, die (für mich) aufdeckt, wenn Sie * die Änderungen automatisch erzwingen müssen, wegen der Lese-Ioslation oder einer anderen Esoterik und ansonsten nur durch Rauschen. Jeder, der sich mit NH auskennt, wird das implizite "Update" auch für angehängte Entitäten verstehen, also tendiere ich dazu, das gleiche von expliziten 'SaveOrUpdate'-Anweisungen zu denken. –

Verwandte Themen