在NHibernate中,我检查实体是否脏了失败

qui*_*uip 10 nhibernate

背景

此问题类似,我需要确定我的NHibernate应用程序中的实体是否脏.在ISession上有一个"IsDirty"方法,但我想检查一个特定的实体,而不是整个会话.

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

通过调用persister.GetPropertyValues()填充currentState数组的行是问题所在.数组充满了空值,而不是我实体的实际值.

当我进入代码时,我发现反射被用于从字段中获取值 - 但字段为空.这似乎是代理的结果,但我不太确定从哪里开始.

qui*_*uip 8

我将默认访问策略从"field.camelcase-underscore"更改为"property",现在该persister.GetPropertyValues()方法返回正确的值.

太早宣布胜利,但似乎很有趣.我正在使用字段访问策略,因为我在实体的属性中有代码来跟踪脏状态.由于我正在删除该代码并依赖于NH来确定脏状态,因此我能够使用属性访问策略.