Created
February 26, 2010 15:29
-
-
Save jdaigle/315798 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static Boolean IsDirtyEntity(this ISession session, Object entity) | |
{ | |
return (DirtyPropertiesOf(session, entity).Any()); | |
} | |
public static IEnumerable<string> DirtyPropertiesOf(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); | |
} | |
if (oldEntry != null) | |
{ | |
Object[] oldState = oldEntry.LoadedState; | |
Object[] currentState = persister.GetPropertyValues(entity, sessionImpl.EntityMode); | |
Int32[] dirtyProps = persister.FindDirty(currentState, oldState, entity, sessionImpl); | |
return dirtyProps != null ? persister.PropertyNames.Where((value, index) => dirtyProps.Contains(index)) : new List<string>(); | |
} | |
return new List<string>(); | |
} | |
public static Boolean IsDirtyProperty(this ISession session, Object entity, String propertyName) | |
{ | |
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); | |
Int32 index = Array.IndexOf(persister.PropertyNames, propertyName); | |
Boolean isDirty = (dirtyProps != null) ? (Array.IndexOf(dirtyProps, index) != -1) : false; | |
return (isDirty); | |
} | |
public static Object GetOriginalEntityProperty(this ISession session, Object entity, String propertyName) | |
{ | |
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); | |
Int32 index = Array.IndexOf(persister.PropertyNames, propertyName); | |
Boolean isDirty = (dirtyProps != null) ? (Array.IndexOf(dirtyProps, index) != -1) : false; | |
return ((isDirty == true) ? oldState[index] : currentState[index]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment