Как настроить прослушиватели событий NHIbernate для обновления и сохранения? - PullRequest
2 голосов
/ 15 января 2012

Исходя из моего предыдущего вопроса Как реализовать LastUpdate в сущностях NHibernate? .

В моей проверенной таблице в моей базе данных есть два столбца:

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

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

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

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 (только *) нет1030 * событий или PreUpdate или PostUpdate)

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

Ответы [ 2 ]

3 голосов
/ 16 января 2012

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

NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
cfg.EventListeners.PreUpdateEventListeners = 
    new IPreUpdateEventListener[] {new YourEventListener()};
sessionFactory = cfg.BuildSessionFactory();
2 голосов
/ 01 января 2014

Похоже, что существует событие PerformUpdate, которое можно переопределить из DefaultSaveOrUpdateEventListener класса

protected override void PerformUpdate(NHibernate.Event.SaveOrUpdateEvent @event, object entity, NHibernate.Persister.Entity.IEntityPersister persister)
{
    base.PerformUpdate(@event, entity, persister);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...