代码之家  ›  专栏  ›  技术社区  ›  Nir

nhibernate inteceptor不需要在多对多集合/列表中进行更改

  •  4
  • Nir  · 技术社区  · 16 年前

    我有一个使用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的好时机,但是如果我必须升级,我会升级。

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Serg Kryvonos    14 年前

    你应该重写 onCollectionUpdate 拦截器的。

    而不是将集合用作 IPersistentCollection 访问其收藏快照和所有者。

    祝你好运!

        2
  •  0
  •   Benjamin    15 年前

    如何实现配置和会话设置?

    您是否将拦截器与这样的配置相关联?

    config.SetInterceptor(new YouInterceptor());
    

    然后打开会话,将其作为这样的参数传递?

    if (config.Interceptor != null)
    {
        session = factory.OpenSession(config.Interceptor);
    }
    else
    {
        session = factory.OpenSession();
    }
    
    推荐文章