Как определить, был ли объект обновлен с помощью Nhibernate? - PullRequest
0 голосов
/ 17 мая 2010

Мне нужно выяснить, как выполнить какое-либо действие (очистить кеш) при обновлении объекта типа X.

Таким образом, когда я сохраняю объект типа Y, ничего не делается, когда я сохраняю неизмененный объект типа X, ничто не должно происходить, но когда этот объект изменяется и выполняется UPDATE, я хочу знать это.

Я пробовал различные события NHibernate (IPostUpdateEventListener, IFlushEntityEventListener и т. Д.), Но безуспешно.

Кто-нибудь может помочь, пожалуйста? Спасибо

Ответы [ 2 ]

2 голосов
/ 19 мая 2010

вы хотите IPostUpdateEventListener. почему вы не публикуете свой код, который не работает, тогда мы можем помочь;)

1 голос
/ 20 мая 2010

Я столкнулся с проблемой в реализованном методе, потому что в некоторых случаях мне приходилось вызывать один и тот же метод при реализации по умолчанию, в противном случае путь кода заканчивался в моем коде.

private readonly DefaultFlushEntityEventListener _impl = new DefaultFlushEntityEventListener();

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

В методе OnFlush IFlushEntityEventListener я не могу обнаружить грязные свойства ... и т. Д.

Но что действительно работает, так это (спасибо Эндрю) этот код

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);
   }
 }
...