2012-01-15 2 views
2

Следующее из моего предыдущего вопроса How to implement LastUpdate in NHibernate Entities?.Как настроить прослушиватели событий NHIbernate для обновления и сохранения?

У меня есть две колонки на моих аудированной таблиц в моей базе данных:

  1. created datetime default getdate() not null (дата создания этой строки)

  2. lastUpdate datetime null (даты и времени эта строка была обновлена)

Я хочу создать слушателя для только обновления в NHibernate, поскольку d Двигатель atabase позаботится о новых записях с ограничением по умолчанию. Я пытался создать специальный приемник с этим кодом:

public class CustomUpdateEventListener : DefaultSaveOrUpdateEventListener 
{ 
    protected override object PerformSaveOrUpdate(SaveOrUpdateEvent evt) 
    { 
     var entity = evt.Entity as IAuditableEntity; 
     if (entity != null) 
     { 
      ProcessEntityBeforeUpdate(entity); 
     } 
     return base.PerformSaveOrUpdate(evt); 
    } 

    internal virtual void ProcessEntityBeforeUpdate(IAuditableEntity entity) 
    { 
     entity.UpdateDate = DateTime.Now; 
    } 
} 

и он прекрасно работает для обновлений, но он также получает бежать за Save событий (при добавлении новых строк в базу данных). Я не хочу, чтобы он запускал новые строки. Я попытался изменить код, чтобы прослушать только Update событий, но я не могу его обработать.

Я попытался изменить класс наследовать от DefaultUpdateEventListener но нет никаких UpdateEvent (только SaveOrUpdate события или PreUpdate или PostUpdate)

мне интересно, если я должен использовать PreUpdate событие и сделать мой слушатель наследоваться от DefaultUpdateEventListener но то я не уверен, какой метод мне нужно переопределить. Для переопределения нет Update.

+0

Я знаю, что это старый пост, но вы столкнулись с этим сообщением в блоге? http://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener – Rippo

ответ

2

Вы можете реализовать свой класс интерфейса IPreUpdateEventListener (и его метод OnPreUpdate). Затем добавить класс к listerners событий сеанса через конфиг:

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration(); 
cfg.EventListeners.PreUpdateEventListeners = 
    new IPreUpdateEventListener[] {new YourEventListener()}; 
sessionFactory = cfg.BuildSessionFactory(); 
+0

Какой класс будет реализовывать это? Мой метод «Update» в моем DAL? Или мой базовый класс сущностей? Куда бы этот код конфигурации пошел? –

+0

Вы можете реализовать это в своем классе CustomEventUpdateListener. Приведенный выше код соединяет фабрику сеансов с этим прослушивателем событий. Затем вы создаете свой сеанс NHibernate с этого завода, и метод OnPreUpdate слушателя будет вызван для каждого объекта, который будет обновляться (через Flush в сеансе). – Wiz101

1

Оказывается, что есть событие PerformUpdate, которые могут быть изменены из DefaultSaveOrUpdateEventListener класса

protected override void PerformUpdate(NHibernate.Event.SaveOrUpdateEvent @event, object entity, NHibernate.Persister.Entity.IEntityPersister persister) 
{ 
    base.PerformUpdate(@event, entity, persister); 
} 
Смежные вопросы