2015-04-20 2 views
3

У меня есть особая необходимость в аудите.NHibernate Envers: Аудиторский объект на основе значения свойства

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

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

Субъект Клиент должен проверяться только тогда, когда свойство Заказов НЕ пусто.

Возможно ли это? Если да, то как я это сделаю?

ответ

3

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

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

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

+0

благодарит за ваш ответ. Первая часть вашего ответа велика, последний абзац не так много :) Мне нужно в какой-то момент показать журнал истории. Поэтому лучше всего регистрировать все, и я отфильтрую журнал истории. – Sam

Смежные вопросы