if (entity is INHibernateProxy)
           {
               className = entity.GetType().BaseType.FullName;
           }Is not safe (have a look to INHibernateProxy).
btw you should have a GuessEntityName in the ISessionFactoryImplementor (I
don't remember exactly where I had put it).

Options/advise
1)
public bool IsDirtyProperty<TEntity, TProp>(TEntity entity,
Expression<Func<TEntity, TProp>> property)

to decode the expression
if (expression.Body.NodeType != ExpressionType.MemberAccess)
{
throw ... isn't a property get
}
return ((MemberExpression)expression.Body).Member.Name;

2) Have a look to INotifyPropertyChanged (.NET FX)

3) Do you really need to know which property was changed ? for what ?
If you need to know if the UnitOfWork is dirty, you can use
ISession.IsDirty()

2009/10/7 Harm Neervens <[email protected]>

>
> Hi Fabio,
>
> That's not exactly what I meant. I want to determine if the property
> is dirty before I flush the object/session.
> But I found a solution that works for me. Can you tell me if it's save
> to do it that way?
>
> My solution:
>
>        public bool IsDirtyProperty(IEntity entity, string
> propertyName)
>        {
>            // Find the className of the Poco object
>            string className = entity.GetType().FullName;
>
>            if (entity is INHibernateProxy)
>            {
>                className = entity.GetType().BaseType.FullName;
>            }
>
>            ISessionImplementor session =
> _Session.GetSessionImplementation();
>
>            IPersistenceContext persistenceContext =
> session.PersistenceContext;
>
>            IEntityPersister persister =
> session.Factory.GetEntityPersister(className);
>
>            EntityKey keyToLoad = new EntityKey(entity.ObjectIdentity,
> persister, session.EntityMode);
>
>            object obj = session.GetEntityUsingInterceptor(keyToLoad);
>
>            EntityEntry oldEntry = session.PersistenceContext.GetEntry
> (obj);
>
>            object[] oldState = oldEntry.LoadedState;
>            object[] currentState = persister.GetPropertyValues(obj,
> session.EntityMode);
>            int[] dirtyProps = persister.FindDirty(currentState,
> oldState, obj, session);
>
>            // Find the index of the propertyName
>            int index = Array.IndexOf(persister.PropertyNames,
> propertyName);
>
>            // Check if the index is in the dirtyProps array
>            bool isDirty = Array.IndexOf(dirtyProps, index) != -1;
>
>            return isDirty;
>        }
>
> Best regards,
> Harm.
>
> On 7 okt, 02:24, Fabio Maulo <[email protected]> wrote:
> > http://tinyurl.com/ydhgsgl
> > 2009/10/6 Harm Neervens <[email protected]>
> >
> >
> >
> > > Is it possible to find out if a property of an entity is changed/
> > > dirty?
> > > I have an entity Customer. When it's saved by the application/GUI, I
> > > want to know if the Address property is dirty. If so, I have to write
> > > a record to a log table.
> >
> > --
> > Fabio Maulo
> >
>


-- 
Fabio Maulo

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to