NHibernate事件监听器持久性 - 它是如何工作的?

时间:2009-08-13 15:14:31

标签: nhibernate persistence event-listener

我决定在NHibernate的最新版本中实现事件监听器,以跟踪谁在进行编辑以及这些编辑是什么。我的问题是这个 - 下面的确有效,我可以逐步完成,但我不确定这些更改是如何保存的......我是否需要构建一个审计表并为其编写映射来调用保存或者什么方法最好是通过“更新日期”和“更新日期”信息获取对象的状态,以便我可以在以后为某人提供此信息。

我认为基类提供了这个(或这个功能的一个子集),但我似乎找不到一篇关于我在这里缺少的好文章。任何帮助将不胜感激!

Imports NHibernate.Event
Imports NHibernate.Event.Default

Public Class CustomSaveEventListener
    Inherits DefaultSaveEventListener

    Protected Overloads Overrides Function PerformSaveOrUpdate(ByVal evt As SaveOrUpdateEvent) As Object
        Dim entity As IEntity = TryCast(evt.Entity, IEntity)
        If entity IsNot Nothing Then
            ProcessEntityBeforeInsert(entity)
        End If

        Return MyBase.PerformSaveOrUpdate(evt)
    End Function

    Friend Overridable Sub ProcessEntityBeforeInsert(ByVal entity As IEntity)
        Dim user As User = DirectCast(Thread.CurrentPrincipal, User)
        entity.ModifiedBy = user.UserName
        entity.ModifiedDate = DateTime.Now
    End Sub
End Class

当我打开Reflector时,我看到下面的这个基类方法 - 但是它究竟做了什么?

protected override object PerformSaveOrUpdate(SaveOrUpdateEvent @event)
{
    EntityEntry entry = @event.Session.PersistenceContext.GetEntry(@event.Entity);
    if ((entry != null) && (entry.Status != Status.Deleted))
    {
        return this.EntityIsPersistent(@event);
    }
    return this.EntityIsTransient(@event);
}

1 个答案:

答案 0 :(得分:3)

当实体变为persitent(保存或加载)时,NH将其添加到内部字典(在session.PersistenceContext中)。这个字典的关键是一个EntityEntry,它包含一些关于实体状态的信息(以及我猜的其他一些东西)。如果未保存实体(瞬态),则不会在内部字典中找到EntityKey。

通过阅读它,看起来这个函数看起来它是实体是暂时的还是没有,并调用好函数(我猜EntityIsTransient触发保存行为,EntityIsPersitent触发更新行为)。

 EntityEntry entry = @event.Session.PersistenceContext.GetEntry(@event.Entity);
    if ((entry != null) && (entry.Status != Status.Deleted))
    {
        return this.EntityIsPersistent(@event);
    }
    return this.EntityIsTransient(@event);

但是关于你的问题,它看起来像一个日志系统。 为什么不直接实现ISaveOrUpdateEvent并使用log4net来记录编辑?