在NHibernate中,检查实体是否脏失败 背景
与之类似,我需要确定我的NHibernate应用程序中的实体是否脏。ISession上有一个“IsDirty”方法,但我想检查一个特定的实体,而不是整个会话 描述一种通过获取实体的数据库状态并将其与实体的当前状态进行比较来检查实体的方法 问题 我已经复制了那个方法,但它对我不起作用。参见代码:在NHibernate中,检查实体是否脏失败 背景,nhibernate,Nhibernate,与之类似,我需要确定我的NHibernate应用程序中的实体是否脏。ISession上有一个“IsDirty”方法,但我想检查一个特定的实体,而不是整个会话 描述一种通过获取实体的数据库状态并将其与实体的当前状态进行比较来检查实体的方法 问题 我已经复制了那个方法,但它对我不起作用。参见代码: public static Boolean IsDirtyEntity(this ISession session, Object entity) { String className = NHi
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数组的行就是问题所在。数组中充满了null,而不是实体中的实际值
当我进入代码时,我发现反射被用来从字段中获取值——但是字段是空的。这似乎是代理的结果,但我不太确定从这里走到哪里。我将默认访问策略从“field.camelcase下划线”更改为“property”,现在
persister.GetPropertyValues()
方法返回正确的值
现在宣布胜利还为时过早,但似乎很有趣。我之所以使用字段访问策略,是因为我在实体的属性中有代码来跟踪脏状态。由于我正在删除该代码并将依赖NH来确定脏状态,所以我能够使用属性访问策略