如何为更新和保存配置NHIbernate事件侦听器

本文关键字:配置 NHIbernate 事件 侦听器 保存 更新 | 更新日期: 2023-09-27 18:20:34

继我之前的问题之后,如何在NHibernate实体中实现LastUpdate?。

我在数据库中的已审核表上有两列:

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

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

我想在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方法。

如何为更新和保存配置NHIbernate事件侦听器

您可以让您的类实现IPreUpdateEventListener接口(及其OnPreUpdate方法)。然后通过config:将您的类添加到会话事件列表器中

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
cfg.EventListeners.PreUpdateEventListeners = 
    new IPreUpdateEventListener[] {new YourEventListener()};
sessionFactory = cfg.BuildSessionFactory();

似乎存在可以从DefaultSaveOrUpdateEventListener类覆盖的PerformUpdate事件

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