Перехватчик NHibernate Проверяет идентификатор вставленного объекта
-
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
?