我需要在對齊所有更改的實體之前寫入一些業務邏輯rigt。我試過的解決方案之一是IPreUpdateEventListener。但是這個事件監聽器已經將對象非規範化爲鍵值。在非規範化之前甚至在刷新之前,我需要一些東西。如何從Nhibernate會話中獲取已更改(髒)實體的列表?
所以問題是如何獲取已更改(diry)實體的列表。
我需要在對齊所有更改的實體之前寫入一些業務邏輯rigt。我試過的解決方案之一是IPreUpdateEventListener。但是這個事件監聽器已經將對象非規範化爲鍵值。在非規範化之前甚至在刷新之前,我需要一些東西。如何從Nhibernate會話中獲取已更改(髒)實體的列表?
所以問題是如何獲取已更改(diry)實體的列表。
您可能會看到Flush事件。但是你究竟想完成什麼?
那麼,我發現最好的解決方案是使用PersistenceContext。
foreach (var entity in eventSource.PersistenceContext.EntityEntries.Keys)
{
// entity is entity to update...
}
不知道這是否正確的解決方案,但是。
我的代碼來檢測髒實體
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);
}
}
感謝,沖刷事件似乎可以工作。它具有IEventSource作爲參數,而eventSource.PersistenceContext.EntityEntries.Keys是所有更改的實體。所有這些東西都需要更新實體的「視圖」。視圖只是主事件的非規範化數據,它們也有引用,這就是爲什麼我不能使用IPreUpdateEventListener。 – 2010-06-28 15:56:45
'PersistenceContext.EntityEntries'並不是所有更改的實體。它是當前會話加載的實體(eventSource)。無論它們是否已更改都沒關係,它們仍將位於EntityEntries中。 – Chaulky 2014-08-06 23:06:04