【发布时间】:2011-05-30 10:53:16
【问题描述】:
我已经使用IPreUpdateEventListener 和IPreInsertEventListener 实现了侦听器来审核对我的应用程序中的表的更改,除了我的多对多关系在连接表中没有其他数据(即我没有'没有用于连接表的 POCO)。
每个可审计对象都实现了一个IAuditable 接口,因此事件侦听器检查POCO 是否属于IAuditable 类型,如果是,它会记录对对象的任何更改。查找表实现了IAuditableProperty 接口,因此如果IAuditable POCO 的属性指向查找表,则更改将记录在主 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();
}
【问题讨论】:
-
深入研究这一点,当我修改多对多集合时,似乎我的
OnPreUpdate和OnPreInsert事件甚至都没有触发,但是更改正在持久化到数据库中。由于 NHibernate 的一些更深层次的魔力,这可能是预期的行为,但对于未洗过的大众来说,这感觉就像是一个错误/遗漏......
标签: c# nhibernate many-to-many audit