我正在重新访问并重新实现导致我询问 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/