4

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>

私はNHibrenate2.0.1を使用しています(それが違いを生む場合)。これは、プロジェクトのライフサイクルでNHibrenateをアップグレードするのに適した時期ではありませんが、どうしても必要な場合はアップグレードします。

ありがとう。

4

2 に答える 2

1

Interceptor のonCollectionUpdateをオーバーライドする必要があります。

CollectionSnapshot と Owner にアクセスするには、コレクションをIPersistentCollectionとして使用します。

そして成功を祈る!

于 2011-10-21T22:04:01.557 に答える
0

構成とセッションのセットアップはどのように実装されていますか?

このような構成で Interceptor を関連付けますか?

config.SetInterceptor(new YouInterceptor());

そして、このようにパラメータとして渡すセッションを開きますか?

if (config.Interceptor != null)
{
    session = factory.OpenSession(config.Interceptor);
}
else
{
    session = factory.OpenSession();
}
于 2011-03-25T11:52:01.087 に答える