IPreUpdateEventListener和dynamic-update ="true"

ds9*_*ove 10 nhibernate nhibernate-mapping

我一直试图在Ayende的博客之后做一个非常简单的审计场景,这似乎是每个人在IPreUpdateEventListener和IPreInsertEventListener时所引用的资源.

然而,无论我怎么努力,我都无法让它发挥作用.事件正确启动,当我通过它时一切看起来都没问题,但是我的"更改时间"没有更新到数据库.

我花了大约一天google搜索这一点,并终于找到了答案在这里.

当您使用dynamic-update ="true"映射实体时,它将无法工作.果然,对我来说就是这样.既然我很难找到这条信息,那么使用dynamic-update ="true"是不常见的?我们在所有实体上使用它.

由于这对我们来说是一个重大障碍,我想问一下这有什么办法吗?

我一直在关注IInterceptor,但它总是被认为是过时的,那么这有什么缺点呢?另外,我还没有找到一个关于如何使用IInterceptor进行相同审计(使用插入/更新时间戳)的非常好的教程(我对NHibernate相当新).

任何帮助,将不胜感激!

Die*_*hon 10

我遇到了这个问题.这就是我修复它的方法:

public class MyFlushEntityEventListener : DefaultFlushEntityEventListener
{
    protected override void DirtyCheck(FlushEntityEvent e)
    {
        base.DirtyCheck(e);
        if (e.DirtyProperties != null &&
            e.DirtyProperties.Any() &&
            //ITrackUpdate is my inteface for audited entities
            e.Entity is ITrackUpdate)
            e.DirtyProperties = e.DirtyProperties
             .Concat(GetAdditionalDirtyProperties(e)).ToArray();
    }

    static IEnumerable<int> GetAdditionalDirtyProperties(FlushEntityEvent @event)
    {
        yield return Array.IndexOf(@event.EntityEntry.Persister.PropertyNames, 
                                   "UpdateTime");
        yield return Array.IndexOf(@event.EntityEntry.Persister.PropertyNames, 
                                   "UpdateUser");
        //You can add any additional properties here.
        //Some of my entities do not track the user, for example.
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,只需替换NH配置文件中的事件侦听器:

<listener type="flush-entity"
          class="MyFlushEntityEventListener, MyAssembly"/>
Run Code Online (Sandbox Code Playgroud)

  • 我开始在实现它之后获得NHibernate.HibernateException"找到对集合的共享引用:"异常.根本原因是调用AppendListeners而不是SetListeners,因此未替换默认的flush实体侦听器.希望这有助于某人,我永远不会得到最后一小时. (3认同)