如何使用Nhibernate检测对象是否已更新?

时间:2010-05-17 11:09:43

标签: c# nhibernate events notify

我需要了解更新类型X的对象时如何执行某些操作(刷新缓存)。

所以当我保存类型为Y的对象时,什么都没做,当我保存类型为X的未更改对象时,什么都不应该发生,但是当这个对象被更改并且进行了更新时,我想知道它。

我尝试了各种NHibernate事件(IPostUpdateEventListenerIFlushEntityEventListener等),但没有成功。

有人可以帮忙吗?感谢

2 个答案:

答案 0 :(得分:2)

你想要一个IPostUpdateEventListener。为什么不发布不起作用的代码,然后我们可以提供帮助;)

答案 1 :(得分:1)

我在实现的方法中遇到问题,因为在某些情况下我必须在默认实现上调用相同的方法,否则代码路径在我的代码中结束。

private readonly DefaultFlushEntityEventListener _impl = new DefaultFlushEntityEventListener();

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

IFlushEntityEventListener的OnFlush方法中,我无法检测到脏属性......等等。

但真正有效的是(感谢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);
   }
 }