Ken*_*ick 6 c# nhibernate audit many-to-many
我已经实现了侦听器来审计应用程序中对表的更改使用IPreUpdateEventListener和IPreInsertEventListener除了我在连接表中没有其他数据的多对多关系之外一切正常(即我没有用于连接表的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)
这不会触发的原因是因为集合没有更改,即它们仍然是之前的 ICollection 实例,但是集合的内容已更改。
我自己也找过这个,事件监听器不处理这种情况。这可能已在 v3.0 中修复(但不要引用我的话)。有一些不理想的解决方法:
1)在对象上放置一个属性,该属性可以以字符串形式表示集合,以便进行审计。
2)使集合中的项目实现接口,以便对它们进行单独审核。
编辑:还有第三个选项:
“而不是多对多,我有一个多对一的连接表,然后一对多从它进入属性表。我将连接表 POCO 隐藏在逻辑后面多对多连接的每一端,但仍然必须实现该对象及其上的所有接口。”