El siguiente código funciona en la inserción, pero en la actualización modifier
nunca se establece, ¿alguna idea de por qué?auditoría de nhibernate con eventos en la actualización
El código para la preactualización se está ejecutando y establece correctamente los valores de estado y entidad en el valor deseado. Sin embargo, al visualizar el sql nhibernate generado no se incluye el campo en la consulta de actualización.
/// <summary> Updates auditable objects </summary>
public class AuditEventListener : IPreInsertEventListener, IPreUpdateEventListener
{
private ISecurityManager securityManager;
public bool OnPreInsert(PreInsertEvent args)
{
var auditable = args.Entity as IAuditable;
if (auditable != null) {
Set(x => auditable.Creator, args.Persister, auditable, args.State, SecurityManager.Identity);
Set(x => auditable.DateAdded, args.Persister, auditable, args.State, Clock.Now);
}
return false;
}
public bool OnPreUpdate(PreUpdateEvent args)
{
var auditable = args.Entity as IAuditable;
if (auditable != null) {
Set(x => auditable.Modifier, args.Persister, auditable, args.State, SecurityManager.Identity);
//Set(x => auditable.DateModified, args.Persister, auditable, args.State, Clock.Now);
}
return false;
}
/// <summary> Type safe method to update sate and entity </summary>
private void Set<T, U>(Expression<Func<U, T>> expression, IEntityPersister persister, U instance, object[] state, T value)
{
var member = expression.Body as MemberExpression;
if (member != null) {
var index = Array.IndexOf(persister.PropertyNames, member.Member.Name);
if (index == -1) {
return;
}
state[index] = value;
var property = (member.Member as PropertyInfo);
if (property != null) {
property.SetValue(instance, value, null);
}
}
}
ISecurityManager SecurityManager
{
get { /* From IoC */ }
}
}
Este código me parece bien, aunque el método Set es inusual. Si coloca un punto de interrupción en OnPreUpdate ¿se llama cuando persiste un objeto actualizado? –
Sí, lo es, creo que el problema tiene algo que ver con que la propiedad no sea considerada sucia por nhibernate. –