NHibernate Envers: объект аудита на основе значения свойства

У меня есть очень специфическая потребность в аудите.

Рассмотрим следующий класс (я изменил название своих классов и обрезал ненужный код для простоты)

[Audited]
public class Client
{
  [NotAudited]
  public virtual IList<Order> Orders {get; set;}
}

Объект Client следует проверять только в том случае, если свойство Orders НЕ пусто.

Это вообще возможно? Если да, то как бы я это сделал?


person Sam    schedule 20.04.2015    source источник


Ответы (1)


Если вы хотите отключить аудит во время выполнения на основе какого-либо состояния, вы можете создать свой собственный подкласс AuditEventListener и передать экземпляр этого типа в метод IntegrateWithEnvers.

В своем подклассе вы можете переопределить OnPostDelete, OnPostInsert, OnPostRecreateCollection, OnPostUpdate, OnPreRemoveCollection и OnPreUpdateCollection. В вашем случае вам, вероятно, следует проверить evt.Entity и evt.AffectedOwnerOrNull. Если вы хотите провести аудит, просто вызовите базовый метод, если вы не хотите проводить аудит, ничего не делайте в своей реализации.

Однако обратите внимание, что вам, вероятно, следует просто сделать это, если вы просто используете Envers для простого ведения журнала. Если вы используете его для воссоздания исторических экземпляров, «удаление» аудита для некоторых исторических событий может вызвать проблемы при загрузке исторических экземпляров. Если это так для вас, безопасно делать это только в том случае, если сущность либо имеет, либо не имеет Orders за всю свою жизнь.

person Roger    schedule 23.04.2015
comment
Спасибо за ваш ответ. Первая часть вашего ответа великолепна, последний абзац не очень :) В какой-то момент мне нужно будет показать журнал истории. Так что будет лучше, если я запишу все и отфильтрую журнал истории. - person Sam; 23.04.2015