W NHibernate moje sprawdzanie, czy obiekt jest brudny, kończy się niepowodzeniem
Podobny doto pytanie, Muszę określić, czy obiekt w mojej aplikacji NHibernate jest brudny, czy nie. Na ISession istnieje metoda „IsDirty”, ale chcę sprawdzić konkretną jednostkę, a nie całą sesję.
Ten post na nhibernate.info opisuje metodę sprawdzania jednostki, pobierając jej stan bazy danych i porównując ją z aktualnym stanem jednostki.
ProblemSkopiowałem tę metodę, ale to nie działa dla mnie. Zobacz kod:
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);
}
Problem stanowi linia wypełniająca tablicę currentState przez wywołanie persister.GetPropertyValues (). Tablica jest pełna wartości null, zamiast rzeczywistych wartości z mojego obiektu.
Kiedy wkroczyłem do kodu, odkryłem, że odbicie jest używane do uzyskania wartości z pól - ale pola są puste. Wydaje się, że jest to wynik działania proxy, ale nie jestem do końca pewien, dokąd się udać.