2010-06-28 51 views
2

我需要在對齊所有更改的實體之前寫入一些業務邏輯rigt。我試過的解決方案之一是IPreUpdateEventListener。但是這個事件監聽器已經將對象非規範化爲鍵值。在非規範化之前甚至在刷新之前,我需要一些東西。如何從Nhibernate會話中獲取已更改(髒)實體的列表?

所以問題是如何獲取已更改(diry)實體的列表。

回答

1

您可能會看到Flush事件。但是你究竟想完成什麼?

+0

感謝,沖刷事件似乎可以工作。它具有IEventSource作爲參數,而eventSource.PersistenceContext.EntityEntries.Keys是所有更改的實體。所有這些東西都需要更新實體的「視圖」。視圖只是主事件的非規範化數據,它們也有引用,這就是爲什麼我不能使用IPreUpdateEventListener。 – 2010-06-28 15:56:45

+0

'PersistenceContext.EntityEntries'並不是所有更改的實體。它是當前會話加載的實體(eventSource)。無論它們是否已更改都沒關係,它們仍將位於EntityEntries中。 – Chaulky 2014-08-06 23:06:04

1

那麼,我發現最好的解決方案是使用PersistenceContext。

foreach (var entity in eventSource.PersistenceContext.EntityEntries.Keys) 
{ 
    // entity is entity to update... 
} 

不知道這是否正確的解決方案,但是。

3

我的代碼來檢測髒實體

 var dirtyObjects = new List<object>(); 
     var sessionImpl = hsession.GetSessionImplementation(); 
     foreach (NHibernate.Engine.EntityEntry entityEntry in sessionImpl.PersistenceContext.EntityEntries.Values) 
     { 
      var loadedState = entityEntry.LoadedState; 
      var o = sessionImpl.PersistenceContext.GetEntity(entityEntry.EntityKey); 
      var currentState = entityEntry.Persister.GetPropertyValues(o, sessionImpl.EntityMode); 
      if (entityEntry.Persister.FindDirty(currentState, loadedState, o, sessionImpl) != null) 
      { 
       dirtyObjects.Add(entityEntry); 
      } 
     } 
相關問題