审核NHibernate中的多对多关系

Ken*_*ick 6 c# nhibernate audit many-to-many

我已经实现了侦听器来审计应用程序中对表的更改使用IPreUpdateEventListenerIPreInsertEventListener除了我在连接表中没有其他数据的多对多关系之外一切正常(即我没有用于连接表的POCO) ).

每个可审计对象都实现一个IAuditable接口,因此事件侦听器会检查POCO是否属于类型IAuditable,如果是,则记录对象的任何更改.查找表实现IAuditableProperty接口,因此如果IAuditablePOCO 的属性指向查找表,则更改将记录在主POCO的日志中.

所以,问题是,我应该如何确定我正在使用多对多集合并在审计表中记录更改?

编辑:我正在使用NHibernate 2.1.2.4000

//first two checks for LastUpdated and LastUpdatedBy ommitted for brevity
else if (newState[i] is IAuditable)
{
    //Do nothing, these will record themselves separately
}
else if (!(newState[i] is IAuditableProperty) && (newState[i] is IList<object> || newState[i] is ISet))
{
    //Do nothing, this is a collection and individual items will update themselves if they are auditable
    //I believe this is where my many-to-many values are being lost
}
else if (!isUpdateEvent || !Equals(oldState[i], newState[i]))//Record only modified fields when updating
{
    changes.Append(preDatabaseEvent.Persister.PropertyNames[i])
        .Append(": ");
    if (newState[i] is IAuditableProperty)
    {
        //Record changes to values in lookup tables
        if (isUpdateEvent)
        {
            changes.Append(((IAuditableProperty)oldState[i]).AuditPropertyValue)
                 .Append(" => ");
        }
        changes.Append(((IAuditableProperty)newState[i]).AuditPropertyValue);
    }
    else
    {
        //Record changes for primitive values
        if(isUpdateEvent)
        {
            changes.Append(oldState[i])
                .Append(" => ");
        }
        changes.Append(newState[i]);
    }
    changes.AppendLine();
}
Run Code Online (Sandbox Code Playgroud)

Gun*_*ner 3

这不会触发的原因是因为集合没有更改,即它们仍然是之前的 ICollection 实例,但是集合的内容已更改。

我自己也找过这个,事件监听器不处理这种情况。这可能已在 v3.0 中修复(但不要引用我的话)。有一些不理想的解决方法:

1)在对象上放置一个属性,该属性可以以字符串形式表示集合,以便进行审计。

2)使集合中的项目实现接口,以便对它们进行单独审核。

编辑:还有第三个选项:

“而不是多对多,我有一个多对一的连接表,然后一对多从它进入属性表。我将连接表 POCO 隐藏在逻辑后面多对多连接的每一端,但仍然必须实现该对象及其上的所有接口。”