NHibernate Interceptor Auditing Вставленный идентификатор объекта - PullRequest
4 голосов
/ 21 мая 2009

Я использую перехватчики NHibernate для регистрации информации об обновлениях / вставках / удалениях для моих различных объектов.

В зарегистрированную информацию включены тип объекта и уникальный идентификатор измененного объекта. Уникальный идентификатор помечен как <generator class="identity"> в файле сопоставления NHibernate.

Очевидная проблема заключается в регистрации операции вставки с использованием IInterceptor.OnSave (). Идентификатор объекта еще не был назначен.

Как я могу получить идентификатор вставленной сущности перед регистрацией информации аудита?

(Я посмотрел на событие NHSBNERNATE Listeners PostSave, но не могу заставить их работать с используемой конфигурацией Spring.net, поэтому я хотел бы по возможности использовать перехватчики)

Код:

    // object id parameter is null...
    public override bool OnSave(object entity, object id, object[] state, 
        string[] propertyNames, IType[] types)
    {            
        AddAuditItem(entity, INSERT);
        return false;            
    }

Ответы [ 2 ]

8 голосов
/ 22 мая 2009

Я решил эту проблему, добавив список в мой класс перехватчиков, который заполняется объектами во время реализации OnSave.

В реализации PostFlush список повторяется, и каждый элемент проверяется как вставка. Объекты в этом списке были сохранены в PostFlush() и, следовательно, сгенерировали идентификаторы.

Кажется, это работает нормально, но я был бы признателен, если бы были указаны возможные ловушки: -)

public class AuditInterceptor : EmptyInterceptor
{       
    // To hold inserted items to be audited after insert has been flushed
    private IList<object> insertItems = new List<object>();

    public override void PostFlush(System.Collections.ICollection entities)
    {            
        foreach (var entity in insertItems)
        {
            AddAuditItem(entity, INSERT);
        }
        insertItems.Clear();

        base.PostFlush(entities);
    }

    public override bool OnSave(object entity, object id, object[] state, 
        string[] propertyNames, IType[] types)
    {            
        var auditable = entity as IAuditable;
        if (auditable != null) 
            insertItems.Add(entity);

        return false;            
    }
}
0 голосов
/ 21 мая 2009

попробуйте метод OnFlushDirty или, может быть, PostFlush

изменить: также, вы можете опубликовать свой код? Разве вы не получаете Id в качестве параметра OnSave?

...