我有一个使用 NHibrenate 的应用程序,我正在使用基于拦截器的解决方案进行日志记录/审计。
基本上我有一个类继承自 EmptyInterceptor 并覆盖 OnFlushDirty、OnSave 和 OnDelete。
一切都完美无缺——除了——当我从使用多对多映射的集合或列表中添加或删除时,不更改任何其他属性,不会调用任何拦截器方法。
如何连接到 NHibrenate 并检测这些变化?
该类看起来像:
public class SomeClass
{
... properties ..
private Iesi.Collections.ISet _setOfOthers = new Iesi.Collections.HashedSet();
public virtual Iesi.Collections.ISet SetOfOthers
{
get { return _setOfOthers; }
set { _setOfOthers = value; }
}
... some more properties ...
}
使用此 hbm 映射:
<class name="MyAssembly.SomeClass, MyAssembly" table="[SomeClass]">
... properties ..
<set name="SetOfOthers" table="SomeClass_SetOfOthers" cascade="none">
<key column="Owner" />
<many-to-many column="Item" class="MyAssembly.OtherClass, MyAssembly" />
</set>
.. some more properties ...
</class>
我正在使用 NHibrenate 2.0.1(如果这有什么不同),这不是项目生命周期中升级 NHibrenate 的好时机 - 但如果我绝对需要,我会升级。
谢谢。
最佳答案
您应该覆盖 onCollectionUpdate拦截器。
比使用集合作为 IPersistentCollection访问其 CollectionSnapshot 和 Owner。
还有祝你好运!
关于NHibernate 拦截器不要求更改多对多集合/列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3005446/