He implementado oyentes para auditar los cambios en las tablas en mi aplicación usando IPreUpdateEventListener
y IPreInsertEventListener
y todo funciona, excepto por mis relaciones muchas a muchas que no tienen datos adicionales en la unión tabla (es decir, no tengo un POCO para la tabla de unión).Auditar la relación muchos a muchos en NHibernate
Cada objeto auditable implementa una interfaz IAuditable
, por lo que el detector de eventos comprueba si un POCO es del tipo IAuditable
y, si lo está, registra cualquier cambio en el objeto. Las tablas de búsqueda implementan una interfaz de IAuditableProperty
, por lo que si una propiedad del POCO IAuditable
apunta a una tabla de búsqueda, los cambios se registran en el registro para el POCO principal.
Entonces, la pregunta es, ¿cómo debo determinar que estoy trabajando con una colección de varios a muchos y registrar los cambios en mi tabla de auditoría?
Editar: estoy usando 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();
}
Profundizando en esto, parece que mis eventos 'OnPreUpdate' y' OnPreInsert' ni siquiera se activan cuando modifico las colecciones de muchos a muchos, pero los cambios se mantienen en la base de datos. Este es probablemente el comportamiento esperado debido a una magia más profunda de NHibernate, pero se siente como un error/omisión de las masas sucias ... – Kendrick