10

我需要获取 NHibernate 会话中使用的对象,这些对象在加载后进行了修改。

Session 提供属性 IsDirty 指示天气对象在 Session 中是否被修改。我需要一个方法来返回导致 IsDirty 返回 true 的对象。

如果你能提供一些 C# 代码来完成这个任务,我会非常感激。

4

2 回答 2

5

Based on the comments of JBL my code to find all "dirty" objects

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);
    }
}
于 2014-09-25T11:13:41.033 回答
0

加载后是否将对象从会话中逐出?

如果不是那将是一个非常尴尬的情况,因为您不知道 sql 是否被 nhibernate 推送。

如果没有最后更新字段,这将是检测脏状态的最简单方法,您为什么不重新加载对象并通过序列化之类的简单方法检查更改。

这很简单,如下所示:

var staleDirtyObjects = new List<Object>();

foreach(var staleObject in staleObjects)
{
    var freshObject = Session.Get<Object>(staleObject.RecId);
    var staleObjectJson = JsonConvert.SerializeObject(staleObject);
    var freshObjectJson = JsonConvert.SerializeObject(freshObject);

    if (!staleObjectJson.Equals(freshObjectJson)) {
        staleDirtyObjects.add(staleObject);
    }
}
于 2014-05-01T20:16:40.030 回答