C# NHibernate中使用事件的数据审核

C# NHibernate中使用事件的数据审核,c#,.net,nhibernate,reflection,C#,.net,Nhibernate,Reflection,我正在重新访问并重新实现导致我询问NHibernate中数据审计的代码。但是这次,我想使用并实现ISaveOrUpdateEventListener(NHibernate2.x中新增的) 我想在数据库中为每个属性的每次更改添加一行,包括旧值和新值,因此稍后在UI中我可以说“用户Bob于2009年3月9日21:04将Wibble的属性从a更改为B” 比较对象状态以确定对象的哪些属性已更改的最佳方法是什么 您可以通过以下方式获取对象的加载状态: public void OnSaveOrUpd

我正在重新访问并重新实现导致我询问NHibernate中数据审计的代码。但是这次,我想使用并实现ISaveOrUpdateEventListener(NHibernate2.x中新增的)

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

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

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

    public void OnSaveOrUpdate(SaveOrUpdateEvent saveOrUpdateEvent)
    {
       object[] foo = saveOrUpdateEvent.Entry.LoadedState;
    }
我想我可以使用反射来找出哪些属性发生了变化,但我一直在四处挖掘,似乎没有一组匹配的属性可以比较。我本以为会有一个GetChangedProperties()方法之类的东西

我总是可以从数据库中获取旧对象,并对其进行比较,但这是另一个数据库命中率,在这种情况下似乎很难处理

最好的方向是什么


另外,如果有什么不同,这是一个ASP.NET-MVC/S#arp架构项目。

您可以通过ILoadEventListener实现一个Memento模式,从初始加载序列化状态。显然,您不想存储集合/关系,或者复制整个对象图。然后,您可以将其取出并在ISaveOrUpdateEventListener中进行比较。

我不知道如何使用
ISaveOrUpdateListener
接口实现您想要的功能-但是,您可以利用
IPreUpdateEventListener
IPreInsertEventListener
接口都提供了您想要的功能需要。。。e、 g.这样做:

public bool OnPreUpdate(PreUpdateEvent evt)
{
    string[] names = evt.Persister.PropertyNames;
    for(int index = 0; index < names.Length; index++)
    {
        // compare evt.State[index] to evt.OldState[index] and get
        // the name of the changed property from 'names'
        // (...)
    }
}
public bool OnPreUpdate(PreUpdateEvent evt)
{
字符串[]名称=evt.Persister.PropertyNames;
for(int index=0;index

并对预插入执行相同的操作。

您还可以在持久化器上使用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.
}
感谢“并从“名称”中获取已更改属性的名称”。我在网上花了15分钟寻找一种可靠的方法来匹配对象和值。