nhibernate - IPreUpdateEventListener 和动态更新 ="true"

标签 nhibernate nhibernate-mapping

我一直在尝试按照 Ayende's blog 做一个非常简单的审计场景。当涉及到 IPreUpdateEventListener 和 IPreInsertEventListener 时,这似乎是每个人都引用的资源。

然而,无论我多么努力,我都无法让它发挥作用。该事件正确触发,当我通过它时一切看起来都不错,但没有向数据库发出我的“更改时间”的更新。

我在谷歌上搜索了大约一天,终于找到了答案 here .

当您将实体映射为 dynamic-update="true"时,它就不起作用了。果然,我就是这种情况。既然我很难找到这条信息,那么使用dynamic-update="true"是不是很少见?我们在所有实体上使用它。

由于这对我们来说是道路上的一个重大障碍,我想问一下是否有任何解决办法?

我一直在看 IInterceptor 但它总是被称为过时的,那么它的缺点是什么?此外,我还没有找到关于如何使用 IInterceptor 归档相同审计(带有插入/更新时间戳)的非常好的教程(我对 NHibernate 相当陌生)。

任何帮助,将不胜感激!

最佳答案

我遇到了这个确切的问题。这是我修复它的方式:

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.
    }
}

然后,只需替换 NH 配置文件中的事件监听器:
<listener type="flush-entity"
          class="MyFlushEntityEventListener, MyAssembly"/>

关于nhibernate - IPreUpdateEventListener 和动态更新 ="true",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5087888/

相关文章:

nhibernate - 如何避免 NHibernate 中不必要的连接

c# - Nhibernate:映射有条件的多对多关系?

c# - 流利的 NHibernate : How do I map Many-to-Many Relationships with additional attributes on the relationship table?

.net - Linq to SQL 仍然是开发应用程序的可行选择吗?

nhibernate - NHibernate session 可以/应该保持打开多长时间?

c# - ISession 在 Azure 辅助角色中应该具有什么生活方式?

c# - 如何防止 Fluent NHibernate 将 "Parent"表的 FK 添加到关系表中?

c# - 避免使用 NHibernate 实体列表进行 N+1 选择

NHibernate 和集合类型

NHibernate 按代码映射 (Loquacious) - 级联选项