Audit many-to-many relationship in NHibernate
Posted
by
Kendrick
on Stack Overflow
See other posts from Stack Overflow
or by Kendrick
Published on 2010-12-24T15:48:15Z
Indexed on
2010/12/24
15:54 UTC
Read the original article
Hit count: 158
I have implemented listeners to audit changes to tables in my application using IPreUpdateEventListener
and IPreInsertEventListener
and everything works except for my many-to-many relationships that don't have additional data in the joining table (i.e. I don't have a POCO for the joining table).
Each auditable object implements an IAuditable
interface, so the event listener checks to see if a POCO is of type IAuditable
, and if it is it records any changes to the object. Look up tables implement an IAuditableProperty
inteface, so if a property of the IAuditable
POCO is pointing to a lookup table, the changes are recorded in the log for the main POCO.
So, the question is, how should I determine I'm working with a many-to-many collection and record the changes in my audit table?
//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();
}
© Stack Overflow or respective owner