NHibernate IPreUpdateEventListener, IPreInsertEventListener does not save to DB

I am trying to implement a simple audit on my objects. Audited objects implement an interface ITimestampablethat defines the properties of DateAddedand DateModified.

I created and registered an event listener to populate these values. Here is the complete code.

internal class TimeStampEventListener : IPreUpdateEventListener, IPreInsertEventListener
    {
        public bool OnPreUpdate(PreUpdateEvent e)
        {
            if (e.Entity is ITimestampable)
            {
                (e.Entity as ITimestampable).DateModified = DateTime.Now;
            }

            return false;
        }

        public bool OnPreInsert(PreInsertEvent e)
        {
            if (e.Entity is ITimestampable)
            {
                (e.Entity as ITimestampable).DateAdded = DateTime.Now;
            }

            return false;
        }

        public void Register(Configuration configuration)
        {
            configuration.SetListener(ListenerType.PreInsert, this);
            configuration.SetListener(ListenerType.PreUpdate, this);
        }
    }

Now, when I make a flush session, the listener is called, the audit properties are set correctly, but most of the time they are not stored in the database. “Most of the time,” I mean, very rarely, values ​​are actually preserved. I'm not sure, but this seems like the first insert / update after the application starts, which is even weirder.

Of course, at first I make changes to the entity, this change is saved, but the audit property is not.

SQL , , NULL , , . Btw. MySQL, DateAdded DateModified DATE.

NHibernate <property>. , - "" ...?

. .

+1
1

/

... . . : , , , . , , , , .

(, ). :

, , :

public class AuditEventListener : IPreUpdateEventListener, IPreInsertEventListener
{
    public bool OnPreUpdate(PreUpdateEvent @event)
    {
        var audit = @event.Entity as IHaveAuditInformation;
        if (audit == null)
            return false;

        var time = DateTime.Now;
        var name = WindowsIdentity.GetCurrent().Name;

        Set(@event.Persister, @event.State, "UpdatedAt", time);
        Set(@event.Persister, @event.State, "UpdatedBy", name);

        audit.UpdatedAt = time;
        audit.UpdatedBy = name;

        return false;
    }

    public bool OnPreInsert(PreInsertEvent @event)
    {
        var audit = @event.Entity as IHaveAuditInformation;
        if (audit == null)
            return false;


        var time = DateTime.Now;
        var name = WindowsIdentity.GetCurrent().Name;

        Set(@event.Persister, @event.State, "CreatedAt", time);
        Set(@event.Persister, @event.State, "UpdatedAt", time);
        Set(@event.Persister, @event.State, "CreatedBy", name);
        Set(@event.Persister, @event.State, "UpdatedBy", name);

        audit.CreatedAt = time;
        audit.CreatedBy = name;
        audit.UpdatedAt = time;
        audit.UpdatedBy = name;

        return false;
    }

Set()

private void Set(IEntityPersister persister, object[] state
       , string propertyName, object value)
{
    var index = Array.IndexOf(persister.PropertyNames, propertyName);
    if (index == -1)
        return;
    state[index] = value;
}
+1

All Articles