0

タイプ X のオブジェクトが更新されたときに何らかのアクション (キャッシュのフラッシュ) を実行する方法を見つける必要があります。

したがって、タイプ Y のオブジェクトを保存しても何も行われず、タイプ X の変更されていないオブジェクトを保存しても何も起こらないはずですが、このオブジェクトが変更されて UPDATE が行われると、それを知りたいです。

さまざまな NHibernate イベント ( IPostUpdateEventListenerIFlushEntityEventListenerなど) を試しましたが、成功しませんでした。

4

2 に答える 2

2

が必要ですIPostUpdateEventListener

于 2010-05-19T09:37:01.227 に答える
1

場合によっては、デフォルトの実装で同じメソッドを呼び出さなければならなかったため、実装されたメソッドで問題が発生していました。そうしないと、コードパスがコードで終了しました。

private readonly DefaultFlushEntityEventListener _impl = new DefaultFlushEntityEventListener();

public void OnFlushEntity(FlushEntityEvent flushEntityEvent)
{
   ... my code goeas here ... 
   _impl.OnFlushEntity(flushEntityEvent);
}

のOnFlushメソッドではIFlushEntityEventListener、ダーティプロパティを検出できません...など。

しかし、実際に機能するのは (Andrew に感謝) このコードです

public void OnPostUpdate(PostUpdateEvent postUpdateEvent)
{
   var dirtyProperties = postUpdateEvent.Persister.FindDirty(postUpdateEvent.State, postUpdateEvent.OldState, postUpdateEvent.Entity, postUpdateEvent.Session);
   int dirty = dirtyProperties.Length;

   if (dirty == 0) // I want detect only modififed entities
      return;
   Trace.WriteLine(string.Format("OnPostUpdate({0}, {3}) in session#{1} - dirty props. {2}", postUpdateEvent.Entity.GetType().Name, postUpdateEvent.Session.GetHashCode(), dirty, postUpdateEvent.Entity.GetHashCode()));
   lock (_objects)
   {
     if (!_objects.Contains(postUpdateEvent.Entity)) // I will manipulate this list in `AbstractFlushingEventListener.PostFlush` method
        _objects.Add(postUpdateEvent.Entity);
   }
 }
于 2010-05-20T09:26:10.373 に答える