【问题标题】:How to get list of changed (dirty) entities from Nhibernate session?如何从 Nhibernate 会话中获取已更改(脏)实体的列表?
【发布时间】:2010-06-28 15:12:52
【问题描述】:

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

所以问题是如何获取已更改(干)实体的列表。

【问题讨论】:

    标签: nhibernate unit-of-work


    【解决方案1】:

    我检测脏实体的代码

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

    【讨论】:

      【解决方案2】:

      您可能会查看 Flush 事件。但是,您到底想完成什么?

      【讨论】:

      • 谢谢,flush 事件似乎可行。它以 IEventSource 作为参数,而 eventSource.PersistenceContext.EntityEntries.Keys 都是已更改的实体。所有这些东西都需要更新实体的“视图”。视图只是主要事件的非规范化数据,它们也有引用,这就是我不能使用 IPreUpdateEventListener 的原因。
      • PersistenceContext.EntityEntries 并非所有已更改的实体。它是当前会话(eventSource)已加载的实体。不管它们是否被更改过,它们仍然会在 EntityEntries 中。
      【解决方案3】:

      嗯,我发现的最佳解决方案是使用 PersistenceContext。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多