Перехватчик NHibernate Проверяет идентификатор вставленного объекта

StackOverflow https://stackoverflow.com/questions/892220

  •  23-08-2019
  •  | 
  •  

Вопрос

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

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

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

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

(Я просмотрел событие postSave прослушивателей NHibernate, но не могу заставить их работать с используемой конфигурацией 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;            
    }
Это было полезно?

Решение

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top