当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用事件在NHibernate中进行数据审计》经验,为你挑选了2个好方法。

我正在重新审视并重新实现导致我在NHibernate中询问有关数据审计的问题的代码.不过这一次,我想要了解Sean Carpenter的建议并实现ISaveOrUpdateEventListener(NHibernate 2.x中的新功能)

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

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

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

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

而且我想我可以使用反射来确定哪些属性已经改变,但我一直在挖掘并且似乎没有一组匹配的匹配属性.我原以为会有一个GetChangedProperties()方法.

我可以随时从数据库中获取旧对象并进行比较,但这是另一个数据库命中,并且在这种情况下似乎很重要.

这个最好的方向是什么?

PS如果它有所不同,这是一个ASP.NET-MVC/S#arp架构项目.



1> Darrell Mozi..:

你也可以在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.
}



2> mookid8000..:

我不知道如何用ISaveOrUpdateListener界面实现你想要的东西- 你可以利用这样的事实,即界面IPreUpdateEventListenerIPreInsertEventListener界面都能提供你所需要的东西......比如做这样的事情:

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'
        // (...)
    }
}

并为预插入做同样的事情.

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有