继我之前的问题How to implement LastUpdate in NHibernate Entities?。
我的数据库中的审计表上有两列:
created datetime default getdate() not null
(此行的创建日期)
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
个事件或PreUpdate
或PostUpdate
)
我想知道我是否应该使用PreUpdate
事件并使我的监听器继承自DefaultUpdateEventListener
但是我不确定我需要覆盖哪种方法。没有Update
方法可以覆盖。
答案 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);
}