Hi,
I am having this problem:
- I load a User entity from the DB using session.Get<T>();
- It loads an additional collection UserGroups containing only one
entity;
- I have an event listener for the SaveOrUpdate event:
cfg.EventListeners.SaveOrUpdateEventListeners =
cfg.EventListeners.SaveOrUpdateEventListeners.Concat(new[] { new
AuditableListener() }).ToArray();
- I check that both entities are not changed, using Fabio's code:
private bool HasDirtyProperties(FlushEntityEvent @event)
{
ISessionImplementor session = @event.Session;
EntityEntry entry = @event.EntityEntry;
var entity = @event.Entity;
if(!entry.RequiresDirtyCheck(entity) || !
entry.ExistsInDatabase || entry.LoadedState == null)
{
return false;
}
IEntityPersister persister = entry.Persister;
object[] currentState = persister.GetPropertyValues(entity,
session.EntityMode); ;
object[] loadedState = entry.LoadedState;
return persister.EntityMetamodel.Properties
.Where((property, i) => !
LazyPropertyInitializer.UnfetchedProperty.Equals(currentState[i]) &&
property.Type.IsDirty(loadedState[i], currentState[i], session))
.Any();
}
- When I call session.IsDirty(), it fires the SaveOrUpdateEvent
passing it the associated UserGroup, which shouldn't be changed;
If, however, I explicitly load the UserGroup instead of the User, when
I call session.IsDirty(), the SaveOrUpdateEvent is not fired, and the
session is not marked as dirty.
Any ideas? Is this a common/known problem?
<class name="User" lazy="false" table="`USER`">
<id name="UsrId" access="property" column="`USR_ID`">
<generator class="hilo" />
</id>
<property name="UsrEmail" type="String" column="`USR_EMAIL`"
length="100" />
<property name="UsrEnabled" type="Boolean" column="`USR_ENABLED`" /
>
<property name="UsrLogin" type="String" column="`USR_LOGIN`"
length="50" />
<property name="UsrPassword" type="String" column="`USR_PASSWORD`"
length="50" />
<property name="UsrRealName" type="String"
column="`USR_REAL_NAME`" length="100" />
<set cascade="all" inverse="true" lazy="true" name="UserGroups">
<key column="`USR_ID`" />
<one-to-many class="UserGroup" />
</set>
</class>
<class name="UserGroup" lazy="false" table="`USER_GROUP`">
<id name="UgrId" access="property" column="`UGR_ID`">
<generator class="hilo" />
</id>
<many-to-one name="Profile" class="Profile" column="`PRF_ID`" not-
null="true" fetch="select" />
<many-to-one name="User" class="User" column="`USR_ID`" not-
null="true" fetch="select" />
</class>
I think the Profile mapping is irrelevant for this matter.
Thanks for your help, once again!
RP
--
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.