我需要在对齐所有更改的实体之前写入一些业务逻辑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