In NHibernate schlägt meine Überprüfung, ob die Entität verschmutzt ist, fehl

Hintergrund

Ähnlich zudiese FrageMuss ich feststellen, ob eine Entität in meiner NHibernate-Anwendung verschmutzt ist oder nicht. Es gibt eine "IsDirty" -Methode für ISession, aber ich möchte eine bestimmte Entität überprüfen, nicht die gesamte Sitzung.

Dieser Beitrag auf nhibernate.info beschreibt eine Methode zum Überprüfen einer Entität, indem ihr Datenbankstatus abgerufen und mit dem aktuellen Status der Entität verglichen wird.

Problem

Ich habe diese Methode kopiert, aber sie funktioniert bei mir nicht. Siehe den Code:

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);
}

Die Zeile, die das currentState-Array durch Aufrufen von persister.GetPropertyValues ​​() auffüllt, ist das Problem. Das Array ist voll von Nullen anstelle der tatsächlichen Werte aus meiner Entität.

Als ich in den Code trat, stellte ich fest, dass Reflektion verwendet wird, um die Werte aus den Feldern abzurufen - aber die Felder sind null. Dies scheint ein Ergebnis des Proxys zu sein, aber ich bin mir nicht ganz sicher, wohin ich von hier aus gehen soll.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage