Wir versuchen, Objekte zu kombinieren, nachdem eine StaleObjectStateException ausgelöst wurde, um eine zusammengeführte Kopie zu speichern.
Hier ist unsere Umweltsituation:
Anwendungsfall:
Wir möchten elegant die Ausnahme behandeln. Da die Benutzer den Besitz des übergeordneten Elements teilen, sollte Benutzer 1 in der Lage sein, erfolgreich zu speichern und das übergeordnete Element sowohl mit seinem neuen Kind als auch mit dem untergeordneten Element von Benutzer 2 zu speichern.
Wenn SOSE laut Ayende ( Ссылка ) geworfen wird:
Ihre Sitzung und ihre geladenen Entitäten sind Toast, weil mit NHibernate eine Ausnahme ausgelöst wird aus einer Sitzung verschiebt diese Sitzung in einen undefinierten Zustand. Sie können diese Sitzung nicht mehr verwenden oder geladene Entitäten
C1 wurde bereits eine ID und Version # von der jetzt nicht nützlichen Sitzung zugewiesen. (Ich wünschte, es wäre nicht gewesen.)
Wie kombinieren wir die Verwendung von ISession.Merge () und ISession.Refresh (), um ein neu gespeichertes Parent zu erhalten, das sowohl C1 als auch C2 hat?
Wir haben eine Reihe von arkanen Permutationen ausprobiert, von denen keine vollständig funktioniert. In der Regel wurde entweder eine Zeile durch eine andere Transaktion aktualisiert oder gelöscht (oder die Zuordnung von nicht gespeicherten Werten war falsch) oder eine ID-Kollision auf der ODBC-Ebene.
Unsere Theorie im Moment:
Die gesamte Dokumentation legt jedoch nahe, dass newSession.Merge vermutlich ist, um zu genügen.
Andere Beiträge, die als Forschung verwendet werden:
Fluent NHibernate Newbie: Row wurde aktualisiert oder durch eine andere Transaktion gelöscht werden
Gibt es ein Alternative zu ISession.Merge (), die nicht bei optimistischer Sperrung ausgelöst wird?
StaleObjectstateException-Zeile wurde von aktualisiert oder gelöscht
Wie kann ich NHibernate zu speichern, nur geändert ändern Eigenschaften
Hibernate (JPA): Wie staleObjectStateException behandelt wird wenn mehrere Objekte geändert und festgelegt wurden (Java, aber relevant, denke ich)
Da die Benutzer den Besitz des übergeordneten Elements teilen, sollte Benutzer 1 erfolgreich speichern und das übergeordnete Element sowohl mit seinem neuen Kind als auch mit dem untergeordneten Element von Benutzer 2 speichern können.
Warum deaktivierst du nicht einfach die optimistische Sperre für die untergeordnete Sammlung? Dann kann jeder childs hinzufügen und es wird nicht die Version des Elternteils erhöhen.
Ansonsten ist hier die Lösung, die mein aktuelles Projekt für alle wiederherstellbaren Ausnahmen verwendet, die eine Sitzung auslösen könnte (z. B. Verbindung zur DB verloren, Fremdschlüssel verletzt, ...):
session.Flush()
wird die Sitzung in MemoryStream
serialisiert. session.Flush()
oder transaction.Commit()
eine wiederherstellbare Ausnahme auslöst, wird die ursprüngliche Sitzung entfernt und die gespeicherte Sitzung wird deserialisiert. Tags und Links nhibernate fluent-nhibernate optimistic-locking staleobjectstate