我有一个非常具体的审计需求。
考虑下面的类(为了简单起见,我更改了类的名称并修剪了不必要的代码)
[Audited]
public class Client
{
[NotAudited]
public virtual IList<Order> Orders {get; set;}
}
只有当Orders属性不为空时,才应对客户端实体进行审计。
这有可能吗?如果是的话,我会怎么做呢?
发布于 2015-04-23 00:55:37
如果希望根据某种状态在运行时关闭审计,则可以创建自己的AuditEventListener
自定义子类,并将该类型的实例传递给IntegrateWithEnvers
方法。
在子类中,可以重写OnPostDelete
、OnPostInsert
、OnPostRecreateCollection
、OnPostUpdate
、OnPreRemoveCollection
和OnPreUpdateCollection
。在您的例子中,您可能应该检查evt.Entity
和evt.AffectedOwnerOrNull
。如果您想审计,只需调用base方法,如果不想审计,则在实现中什么也不做。
但是,请注意,如果您只使用Envers进行简单日志记录,那么您可能就应该这样做。如果使用它重新创建历史实例,则在加载历史实例时,对某些历史事件的“删除”审核可能会导致问题。如果对您来说是这样的话,那么只有当一个实体在其整个生命周期中都有或没有获得Orders
时,才能安全地做到这一点。
https://stackoverflow.com/questions/29750792
复制