Идентификатор вставленного объекта аудита перехватчика NHibernate

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

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

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

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

(Я просмотрел событие NHibernate 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;            
    }

person TonE    schedule 21.05.2009    source источник


Ответы (2)


Я обошел эту проблему, добавив список в свой класс перехватчика, который заполняется объектами во время реализации 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;            
    }
}
person TonE    schedule 22.05.2009

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

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

person Matt Hinze    schedule 21.05.2009
comment
Спасибо за ответ. Я пробовал PostFlush, но как я могу определить, какие элементы в параметре сущностей ICollection были только что вставлены? Если бы был способ идентифицировать это, он бы работал нормально ... - person TonE; 21.05.2009
comment
Я верю всем им .. Разве это не так? - person Matt Hinze; 21.05.2009
comment
Нет, коллекция содержит все объекты, состояние которых было обновлено из базы данных. - person TonE; 21.05.2009
comment
Хорошо, я исправлюсь. возможно, это заслуживает внимания nhusers. - person Matt Hinze; 21.05.2009