Grund Reihenfolge der Ausführung:NHibernate NonUniqueObjectException wenn Objekte in die Sitzung wieder anbringen (mit Lock)
- Eine Sammlung von
PersistentObjects
abgefragt wird dann von der Sitzung getrennt zwischengespeichert. - Die Auflistung wird an ein Modul übergeben, das sie erneut an die Sitzung anfügen muss, um einige der Eigenschaften (unter Verwendung von
session.Lock(obj, LockMode.None)
) zu laden. - Nachdem das Modul die Verarbeitung abgeschlossen hat, versucht ein anderes Modul,
SaveOrUpdate
einUserSetting
Objekt mit einigen Verwendungsstatistiken für den Benutzer zu initialisieren, der die Aktion initialisiert hat. - Auf
session.Flush()
NHibernate wirft eineNonUniqueObjectException
.
Ich habe festgestellt, dass ein Weg, um dieses Problem zu arbeiten ist mit neuen Kopien der Objekte zu erhalten:
obj = session.Get(obj.GetType(), (obj as PersistentObject).Id);
statt mit session.Lock
von reattaching. Dies ist jedoch nicht optimal, da einige der Datensätze potenziell recht groß sind. Wenn Sie jedes Objekt einzeln neu abrufen, kann dies zu einem Leistungsverlust führen.
Das Objekt, das nicht eindeutig ist, ist ein referenziertes Objekt, das nur in der Klasse PersistentObject
und nicht in der Klasse UserSetting
existiert. Ich kann also nicht verstehen, warum ein Flush diese Ausnahme verursachen würde.
Ich habe versucht, die zwischengespeicherten Objekte zu entfernen, nachdem das Modul mit ihnen fertig ist, aber das hilft nicht.
Kennt jemand eine bessere Möglichkeit, Objekte an die Sitzung anzuhängen, die dieses Problem vermeiden könnte?
Doh! Das ist die naheliegende Lösung und die, an die ich hätte denken sollen. Jetzt fühle ich mich dumm. ;) – Joel