如何使用C#和FluentNHibernate在NHibernate中获取Dirty Entities

seb*_*ler 9 c# nhibernate

我需要获取NHibernate会话中使用的对象,这些对象在加载后被修改.

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

如果您可以提供一些C#代码来完成此任务,我会非常感激.

Fri*_*ied 5

根据 JBL 的注释,我的代码查找所有“脏”对象

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*lez 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);
    }
}
Run Code Online (Sandbox Code Playgroud)