c# - 使用事件在 NHibernate 中进行数据审计

标签 c# .net nhibernate reflection

我正在重新访问并重新实现导致我询问 this question 的代码关于 NHibernate 中的数据审计。然而这一次,我想和Sean Carpenter一起去的 suggestion并实现 ISaveOrUpdateEventListener(NHibernate 2.x 中的新功能)

我想在数据库中为每个具有旧值和新值的属性的每次更改添加一行,所以稍后在 UI 中我可以说 “用户 Bob 将 Wibble 的属性从 A 更改为 B 2009 年 3 月 9 日 21:04"

比较对象状态以确定对象的哪些属性已更改的最佳方法是什么?

您可以通过以下方式获取对象的加载状态:

    public void OnSaveOrUpdate(SaveOrUpdateEvent saveOrUpdateEvent)
    {
       object[] foo = saveOrUpdateEvent.Entry.LoadedState;
    }

而且我想我可以使用反射来确定哪些属性发生了变化,但我一直在四处挖掘,似乎没有一组匹配的属性可供比较。我原以为会有 GetChangedProperties() 方法或其他方法。

我总是可以按原样从数据库中获取旧对象并进行比较,但那是另一个数据库命中,在这种情况下看起来很笨重。

最好的方向是什么?

附言如果有任何区别,这是一个 ASP.NET-MVC/S#arp 架构项目。

最佳答案

您还可以在 Persister 上使用 FindDirty 方法让 NHibernate 为您进行比较:

var dirtyFieldIndexes = @event.Persister.FindDirty(@event.State, @event.OldState, @event.Entity, @event.Session);

foreach (var dirtyFieldIndex in dirtyFieldIndexes)
{
    var oldValue = @event.OldState[dirtyFieldIndex];
    var newValue = @event.State[dirtyFieldIndex];

    // Log values to new "AuditLog" object and save appropriately.
}

关于c# - 使用事件在 NHibernate 中进行数据审计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/626931/

相关文章:

sql - NHibernate 排序(SQL 作为第二个选项)

c# - MongoDb:用ruby插入UUID后,c#无法将其转换为GUID

c# - C#中StrLikeText()方法如何比较 '#'的字符串?

.net - 程序集中的模板函数不可见

c# - 为什么将动态对象类型转换为对象会抛出空引用异常?

c# - nhibernate queryOver 投影语法

c# - NHibernate ISession.save(newTransientEntity) 是否只会返回生成的 Id,但不会更新实体的 Id 属性?

c# - 在数据类型和调用匹配方法之间进行选择?

c# - 在 mvc 4 中找不到 DbContext

.net - EntityFramework 4.0 获取复杂类型映射