簡體   English   中英

NHibernate inteceptor不需要在多對多集/列表中進行更改

[英]NHibernate inteceptor not called for changes in many-to-many set/list

我有一個使用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的好時機 - 但如果我絕對需要,我會升級。

謝謝。

您應該覆蓋Interceptor的onCollectionUpdate

比使用集合作為IPersistentCollection來訪問其CollectionSnapshot和Owner。

還有祝你好運!

您的配置和會話設置如何實現?

您是否將Interceptor與此類配置相關聯?

config.SetInterceptor(new YouInterceptor());

然后打開會話傳遞它作為這樣的參數?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM