NHibernate Interceptor Auditoría Id Insertado Object
-
23-08-2019 - |
Pregunta
Estoy utilizando interceptores de NHibernate para registrar información sobre actualizaciones / Inserción / Elimina a mis diversas entidades.
Se incluye en la información registrada es el tipo de entidad y el identificador único de la entidad modificada. El identificador único se marca como un <generator class="identity">
en el archivo de asignación de NHibernate.
El problema obvio es al iniciar sesión una operación de inserción usando IInterceptor.OnSave () el ID de la entidad todavía no se ha asignado.
¿Cómo puedo obtener el identificador de la entidad insertada antes de iniciar la información de auditoría?
(He mirado en caso de NHibernate oyentes postSave pero no puede conseguir que el trabajo con la configuración Spring.net siendo utilizado, por lo que me gustaría seguir con interceptores si es posible)
Código:
// object id parameter is null...
public override bool OnSave(object entity, object id, object[] state,
string[] propertyNames, IType[] types)
{
AddAuditItem(entity, INSERT);
return false;
}
Solución
He trabajado en torno a este problema mediante la adición de una lista a mi clase de interceptor, que se rellena con objetos durante la ejecución OnSave
.
En la implementación PostFlush
la lista se repiten a lo largo y cada elemento es auditada como un inserto. Los objetos de esta lista se han persistido en PostFlush()
y de este modo han generado IDs.
Esto parece funcionar bien, pero yo estaría muy agradecido si cualquier peligros potenciales se señalaron: -)
public class AuditInterceptor : EmptyInterceptor
{
// To hold inserted items to be audited after insert has been flushed
private IList<object> insertItems = new List<object>();
public override void PostFlush(System.Collections.ICollection entities)
{
foreach (var entity in insertItems)
{
AddAuditItem(entity, INSERT);
}
insertItems.Clear();
base.PostFlush(entities);
}
public override bool OnSave(object entity, object id, object[] state,
string[] propertyNames, IType[] types)
{
var auditable = entity as IAuditable;
if (auditable != null)
insertItems.Add(entity);
return false;
}
}
Otros consejos
probar el método de OnFlushDirty
.. o tal vez PostFlush
Edit: También, se puede publicar su código? No se obtiene el Id como un parámetro para OnSave
?