Ein NHibernate-Audit-Trail, der keine "Sammlungsfehler" verursacht

8

Ayende hat einen Artikel darüber, wie man einen einfachen Audit-Trail für NHibernate implementiert () hier ) Event-Handler verwenden.

Wie in den Kommentaren zu sehen ist, verursacht seine Implementierung leider die folgende Ausnahme: collection xxx wurde nicht von flush ()

verarbeitet

Das Problem scheint der implizite Aufruf von ToString in den Dirty-Eigenschaften zu sein, der Probleme verursachen kann, wenn die Dirty-Eigenschaft ebenfalls eine zugeordnete Entität ist.

Ich habe mein Bestes getan, um eine funktionierende Implementierung zu bauen, aber ohne Erfolg.

Kennt jemand eine funktionierende Lösung?

    
cbp 22.06.2010, 06:22
quelle

4 Antworten

9

Ich konnte dasselbe Problem mithilfe der folgenden Problemumgehung lösen: Setzen Sie das verarbeitete Flag für alle Auflistungen im aktuellen Persistenzkontext innerhalb des Listeners auf true

%Vor%

Hoffe, das hilft.

    
Yura Ageev 02.09.2010 18:22
quelle
8

Der Fehler sollte der folgende sein. Erstellen Sie eine neue Ereignis-Listener-Klasse, und leiten Sie sie aus NHibernate.Event.Default.DefaultFlushEventListener:

ab %Vor%

Registrieren Sie es während der NHibernate-Konfiguration:

%Vor%

Sie können mehr über diesen Fehler in Hibernate JIRA lesen: Ссылка

Das nächste Release von NHibernate sollte dieses Update entweder enthalten.

    
desunit 20.07.2012 07:57
quelle
4

Das ist gar nicht so einfach. Ich habe so etwas geschrieben, aber es ist sehr spezifisch für unsere Bedürfnisse und nicht trivial.

Einige zusätzliche Hinweise:

Sie können testen, ob Referenzen mit

geladen werden %Vor%

oder

%Vor%

Sie können Sammlungen in IPersistentCollection umwandeln. Ich habe eine IInterceptor implementiert, wo ich den NHibernate Typ jeder Eigenschaft bekomme, ich weiß nicht, wo du das bekommen kannst, wenn du Events verwendest:

%Vor%

Wenn Sie das Update-Ereignis von NHibernate erhalten, wird die Instanz initialisiert. Sie können sicher auf Eigenschaften primitiver Typen zugreifen. Wenn Sie ToString verwenden möchten, stellen Sie sicher, dass Ihre ToString - Implementierung nicht auf referenzierte Entitäten oder Sammlungen zugreift.

Sie können NHibernate-Metadaten verwenden, um herauszufinden, ob ein Typ als Entity zugeordnet ist oder nicht. Dies könnte nützlich sein, um in Ihrem Objektmodell zu navigieren. Wenn Sie auf eine andere Entität verweisen, erhalten Sie bei dieser Änderung zusätzliche Aktualisierungsereignisse.

    
Stefan Steinegger 22.06.2010 06:56
quelle
0

Ich konnte feststellen, dass dieser Fehler ausgelöst wird, wenn der Anwendungscode ein Lazy Property lädt, wenn die Entity über eine Sammlung verfügt.

Bei meinem ersten Versuch wurde nach neuen CollectionEntries gesucht (was ich nie verarbeiten möchte, da es eigentlich keine Änderungen geben sollte). Dann markieren Sie sie als IsProcessed = true , damit sie keine Probleme verursachen.

%Vor%

Allerdings hat dies das Problem nicht vollständig gelöst. In einigen Fällen würde ich immer noch die Ausnahme bekommen.

Wenn OnPostUpdate aufgerufen wird, sollten die Werte im CollectionEntries -Verzeichnis alle bereits auf IsProcessed = true gesetzt sein. Also entschloss ich mich, eine zusätzliche Überprüfung durchzuführen, um zu sehen, ob die nicht verarbeiteten Sammlungen dem entsprechen, was ich erwartet habe.

%Vor%

In den Fällen, in denen mein erster Versuch behoben wurde, würden diese Zahlen genau übereinstimmen. In den Fällen jedoch, in denen es nicht funktionierte, gab es im Wörterbuch bereits zusätzliche Elemente. In meinem konnte ich sicher sein, dass diese zusätzlichen Elemente auch nicht zu Updates führen würden, so dass ich einfach IsProcessed = true für alle valuesNotProcessed festlegen konnte.

    
Daniel Little 10.03.2014 08:06
quelle

Tags und Links