I'm trying to add audit fields to my domain objects before they are inserted or updated by utilizing NHibernate event listeners. Utilizing the IPreInsert
and IPreUpdate
event listener interfaces, I am able to set the auditing fields on all the domain objects except for those that have the auditing fields stored in a parent object's table. For example, here are my entity classes:
public class Person : Entity
{
public string name {get; set;}
}
public class Entity : PersistentEntity
{
public int EntityTypeId {get; set;}
}
public abstract class PersistentEntity
{
public virtual Guid Id { get; set;}
public virtual Guid UpdateUser {get; set;}
public virtual DateTime UpdateDate {get; set;}
}
Here are my mappings:
public class PersonMap : SubclassMap<Person>
{
Map(x => x.Name);
}
public class EntityMap : PersistentEntityMap<Entity>
{
Map(x => x.EntityTypeId);
}
public abstract class PersistentEntityMap<T> : ClassMap<T> where T : PersistentEntityMap
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.UpdateUser);
Map(x => x.UpdateDate);
}
And here is how the tables are defined:
Person Table:
- Id
- Name
Entity Table:
- Id
- EntityTypeId
- UpdateUser
- UpdateDate
So given this setup, the IPreInsert
event listener works perfectly, inserting a new person into the person table and inserting a new Entity
into the Entity
table with UpdateUser
and UpdateDate
correctly populated. However, if I where to update the person's name, the IPreUpdate
event listener fires and does change the UpdateDate
field on the object, but an update on the entity table is never performed. Taking advise from this page,
http://nhforge.org/wikis/howtonh/changing-values-in-nhibernate-events.a开发者_如何学Cspx
I tried using both IFlushEntity
and ISaveOrUpdate
event listeners to no effect.
精彩评论