2009-09-04 10 views
3

Ich möchte die Konversation pro Geschäftsvorgangsmuster in einer WPF-Anwendung wie beschrieben here implementieren. Leider verfügt diese Anwendung über eine große vorhandene Datenbank, die von SQL Server generierte Identitätsschlüssel in allen Tabellen verwendet.NHibernate Conversation pro Geschäftsvorgang und Identitätsschlüssel

Ich weiß, dass das Hinzufügen eines neuen Objekts zu einer NHibernate-Sitzung dazu führt, dass es eingefügt wird, wenn es einen Identitätsschlüssel hat. Fabio hat das Muster, das die aktuelle Transaktion am Ende jeder Anfrage festschreibt, obwohl wir noch nicht die gesamte Arbeitseinheit fertiggestellt haben.

Wenn ich richtig verstehe, bedeutet dies, dass meine Objekte in die Datenbank eingefügt werden und nicht entfernt werden, auch wenn ich die Arbeitseinheit verlasse. Also:

  • Ist dieses Muster mit Identitätsschlüsseln inkompatibel?
  • Gibt es irgendwelche vernünftigen Arbeitsumgebungen?
  • Gibt es ein besseres Muster, das ich in diesem Fall verwenden kann?

Edit # 1:

Einige zusätzliche Kommentare von Fabio sind here.

Edit # 2:

Explo hat mich weiter führen zu den bestehen (...) Methode, die save (...) aber einfach anders genug, um verwirrend zu ähnlich ist. Diese Aussage aus dem hibernate FAQs genommen ist interessant:

Die persistieren() -Methode auch garantiert dass es eine INSERT Anweisung nicht ausgeführt werden, wenn sie außerhalb von Transaktionsgrenzen genannt wird. Dies ist nützlich in in lang laufenden Konversationen mit einem erweiterten Session/Persistenzkontext .

Sicherlich, wenn es innerhalb einer Transaktionsgrenze dasselbe garantiert, wäre es nützlicher? Ich hatte den Eindruck, dass die Verwendung von Transaktionen sowieso nicht verpönt war.

+0

Ich habe gerade versucht Session.Persist() und es führte sofort eine Einfügung, obwohl ich keine offene Transaktion hatte - wenn das ist, was es zu tun ist, funktioniert es nicht (auf 2.1 zumindest). – Sam

Antwort

1

Eine Problemumgehung - Sie können Ihre ISession.Save s anhalten, bis Sie bereit sind, Ihre Arbeitseinheit zu übergeben, möglicherweise als eine Sammlung von vorübergehenden Instanzen in Ihrer Einheit Arbeitsklasse.

Wenn Ihre Entitäten von einer vorhandenen Entität referenziert werden (und das ist sinnvoll), können Sie die Inserts kaskadieren - konsistent, das heißt, Sie sollten nur Ihre aggregierten Root-Objekte explizit einfügen müssen. Dies ist der Ansatz, den ich normalerweise in dieser Situation verwende.

Verwandte Themen