Я пытаюсь добавить поля аудита в мои доменные объекты, прежде чем они будут вставлены или обновлены с использованием прослушивателей событий NHibernate. Используя интерфейсы прослушивания событий IPreInsert
и IPreUpdate
, я могу установить поля аудита для всех объектов домена, за исключением тех, у которых поля аудита хранятся в таблице родительского объекта. Например, вот мои классы сущностей:
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;}
}
Вот мои отображения:
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);
}
А вот как определяются таблицы:
Персона Таблица:
Таблица сущностей:
- Id
- EntityTypeId
- UpdateUser
- UpdateDate
Таким образом, при такой настройке прослушиватель событий IPreInsert
работает отлично, вставляя нового человека в таблицу персон и вставляя новый Entity
в таблицу Entity
с правильно заполненными UpdateUser
и UpdateDate
. Однако, если я должен обновить имя человека, прослушиватель событий IPreUpdate
запускается и изменяет поле UpdateDate
объекта, но обновление таблицы сущностей никогда не выполняется. Принимая советы с этой страницы,
http://nhforge.org/wikis/howtonh/changing-values-in-nhibernate-events.aspx
Я пытался использовать прослушиватели событий IFlushEntity
и ISaveOrUpdate
безрезультатно.