如何为Update和Save配置NHIbernate事件侦听器?

时间:2012-01-15 19:15:46

标签: c# nhibernate

继我之前的问题How to implement LastUpdate in NHibernate Entities?

我的数据库中的审计表上有两列:

  1. created datetime default getdate() not null(此行的创建日期)

  2. lastUpdate datetime null(此行上次更新的日期时间)

  3. 我想在NHibernate中为仅更新创建一个监听器,因为数据库引擎会使用默认约束来处理新记录。我尝试使用以下代码创建自定义侦听器:

    public class CustomUpdateEventListener : DefaultSaveOrUpdateEventListener
    {
        protected override object PerformSaveOrUpdate(SaveOrUpdateEvent evt)
        {
            var entity = evt.Entity as IAuditableEntity;
            if (entity != null)
            {
                ProcessEntityBeforeUpdate(entity);
            }
            return base.PerformSaveOrUpdate(evt);
        }
    
        internal virtual void ProcessEntityBeforeUpdate(IAuditableEntity entity)
        {
            entity.UpdateDate = DateTime.Now;
        }
    }
    

    并且它适用于更新,但它也可以运行Save个事件(当我向数据库添加新行时)。我不希望它为新行开火。我试图更改代码只收听Update事件,但我无法解决。

    我尝试将类更改为继承自DefaultUpdateEventListener,但没有UpdateEvent(仅SaveOrUpdate个事件或PreUpdatePostUpdate

    我想知道我是否应该使用PreUpdate事件并使我的监听器继承自DefaultUpdateEventListener但是我不确定我需要覆盖哪种方法。没有Update方法可以覆盖。

2 个答案:

答案 0 :(得分:3)

您可以让您的类实现IPreUpdateEventListener接口(及其OnPreUpdate方法)。然后通过config:

将您的类添加到会话事件listerners中
NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
cfg.EventListeners.PreUpdateEventListeners = 
    new IPreUpdateEventListener[] {new YourEventListener()};
sessionFactory = cfg.BuildSessionFactory();

答案 1 :(得分:2)

似乎有一个可以从DefaultSaveOrUpdateEventListener类重写的PerformUpdate事件

protected override void PerformUpdate(NHibernate.Event.SaveOrUpdateEvent @event, object entity, NHibernate.Persister.Entity.IEntityPersister persister)
{
    base.PerformUpdate(@event, entity, persister);
}