Ich habe Listener implementiert, um Änderungen an Tabellen in meiner Anwendung mit IPreUpdateEventListener
und IPreInsertEventListener
zu überwachen, und alles funktioniert außer für meine Viele-zu-viele-Beziehungen, die keine zusätzlichen Daten in der Verknüpfung haben Tabelle (dh ich habe kein POCO für die Verbindungstabelle).Viele-zu-viele-Beziehung in NHibernate überprüfen
Jedes auditierbare Objekt implementiert eine IAuditable
-Schnittstelle, sodass der Ereignis-Listener überprüft, ob ein POCO vom Typ IAuditable
ist, und falls dies der Fall ist, werden Änderungen am Objekt aufgezeichnet. Nachschlagetabellen implementieren eine IAuditableProperty
Schnittstelle, wenn also eine Eigenschaft der IAuditable
POCO auf eine Nachschlagetabelle zeigt, werden die Änderungen im Protokoll für die Haupt-POCO aufgezeichnet.
Die Frage ist also, wie soll ich feststellen, dass ich mit einer Viele-zu-Viele-Sammlung arbeite und die Änderungen in meiner Audit-Tabelle aufzeichne?
Edit: Ich verwende NHibernate 2.1.2.4000
//first two checks for LastUpdated and LastUpdatedBy ommitted for brevity
else if (newState[i] is IAuditable)
{
//Do nothing, these will record themselves separately
}
else if (!(newState[i] is IAuditableProperty) && (newState[i] is IList<object> || newState[i] is ISet))
{
//Do nothing, this is a collection and individual items will update themselves if they are auditable
//I believe this is where my many-to-many values are being lost
}
else if (!isUpdateEvent || !Equals(oldState[i], newState[i]))//Record only modified fields when updating
{
changes.Append(preDatabaseEvent.Persister.PropertyNames[i])
.Append(": ");
if (newState[i] is IAuditableProperty)
{
//Record changes to values in lookup tables
if (isUpdateEvent)
{
changes.Append(((IAuditableProperty)oldState[i]).AuditPropertyValue)
.Append(" => ");
}
changes.Append(((IAuditableProperty)newState[i]).AuditPropertyValue);
}
else
{
//Record changes for primitive values
if(isUpdateEvent)
{
changes.Append(oldState[i])
.Append(" => ");
}
changes.Append(newState[i]);
}
changes.AppendLine();
}
Wenn ich weiter in dieses Thema eindringe, scheinen meine 'OnPreUpdate' und' OnPreInsert' Ereignisse nicht einmal zu schießen, wenn ich die Viele-zu-Viele-Sammlungen modifiziere, aber die Änderungen werden in der Datenbank gespeichert. Dies ist wahrscheinlich aufgrund einiger tieferer Magie von NHibernate zu erwarten, aber es fühlt sich wie ein Bug/Ommision zu den ungewaschenen Massen ... – Kendrick