与this question类似,我需要确定我的NHibernate应用程序中的实体是否脏。在ISession上有一个“IsDirty”方法,但我想检查一个特定的实体,而不是整个会话。
This post on nhibernate.info描述了一种通过获取数据库状态并将其与实体的当前状态进行比较来检查实体的方法。
我已经复制了这种方法,但它对我不起作用。见代码:
public static Boolean IsDirtyEntity(this ISession session, Object entity)
{
String className = NHibernateProxyHelper.GuessClass(entity).FullName;
ISessionImplementor sessionImpl = session.GetSessionImplementation();
IPersistenceContext persistenceContext = sessionImpl.PersistenceContext;
IEntityPersister persister = sessionImpl.Factory.GetEntityPersister(className);
EntityEntry oldEntry = sessionImpl.PersistenceContext.GetEntry(entity);
if ((oldEntry == null) && (entity is INHibernateProxy))
{
INHibernateProxy proxy = entity as INHibernateProxy;
Object obj = sessionImpl.PersistenceContext.Unproxy(proxy);
oldEntry = sessionImpl.PersistenceContext.GetEntry(obj);
}
Object [] oldState = oldEntry.LoadedState;
Object [] currentState = persister.GetPropertyValues(entity, sessionImpl.EntityMode);
Int32 [] dirtyProps = persister.FindDirty(currentState, oldState, entity, sessionImpl);
return (dirtyProps != null);
}
通过调用persister.GetPropertyValues()填充currentState数组的行是问题所在。数组充满了空值,而不是我实体的实际值。
当我进入代码时,我发现正在使用反射来获取字段中的值 - 但字段为空。这似乎是代理的结果,但我不太确定从这里开始。
答案 0 :(得分:8)
我将默认访问策略从“field.camelcase-underscore”更改为“property”,现在persister.GetPropertyValues()
方法返回正确的值。
宣布胜利太早,但似乎很有趣。我正在使用字段访问策略,因为我在实体的属性中有代码来跟踪脏状态。由于我正在删除该代码并依赖NH来确定脏状态,因此我能够使用属性访问策略。