如何从Nhibernate会话中获取已更改(脏)实体的列表?

时间:2010-06-28 15:12:53

标签: nhibernate unit-of-work

在刷新所有已更改的实体之前,我需要编写一些业务逻辑。我尝试过的解决方案之一是IPreUpdateEventListener。但是这个事件监听器已经将对象非规范化为键值。我在非规范化之前需要一些东西,甚至在冲洗之前。

所以问题是如何获得更改(diry)实体的列表。

3 个答案:

答案 0 :(得分: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);
            }
        }

答案 1 :(得分:1)

你可能会看看Flush事件。但是你想要完成什么呢?

答案 2 :(得分:1)

好吧,我发现最好的解决方案是使用PersistenceContext。

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

不确定这是否是正确的解决方案。