我需要获取NHibernate会话中使用的对象,这些对象在加载后被修改。
会话提供属性IsDirty,指示天气对象是否在会话中被修改。 我需要一个方法来返回导致IsDirty返回true的对象。
如果您可以提供一些C#代码来完成此任务,我会非常感激。
答案 0 :(得分:4)
根据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);
}
}
答案 1 :(得分:0)
加载后是否从会话中逐出对象?
如果不是那个非常尴尬的情况,因为你不知道nhibernate是否推送了sql。
如果没有最后一次更新字段,这是检测脏状态的最简单方法,为什么不加载对象,并通过序列化之类的简单方法检查更改。
这很简单如下:
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);
}
}