NHibernate Envers:根据属性值审计实体

3

我很需要一个特定的审计需求。

考虑以下类(为了简单起见,我更改了我的类名并删除了不必要的代码)

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

只有在订单属性不为空时才应审核客户实体。

这是否可能?如果是,我该怎么做?

1个回答

3
如果你想根据某些状态在运行时关闭审计,你可以创建自己的AuditEventListener子类,并将该类型的实例传递给IntegrateWithEnvers方法。
在你的子类中,你可以重写OnPostDeleteOnPostInsertOnPostRecreateCollectionOnPostUpdateOnPreRemoveCollectionOnPreUpdateCollection。在你的情况下,你应该检查evt.Entityevt.AffectedOwnerOrNull。如果你想进行审计,只需调用基本方法;如果不想进行审计,则在你的实现中不执行任何操作。
但请注意,如果你只是使用Envers进行简单的日志记录,那么你可能只需要这样做。如果你使用它来重新创建历史实例,在加载历史实例时“删除”某些历史事件的审计可能会导致问题。如果你的情况是这样,只有当一个实体在其整个生命周期内具有或不具有Orders时,才能安全地这样做。

谢谢您的回复。您的答案的前半部分很好,但最后一段不太适合我的需求 :) 我需要在某个时候展示历史记录。因此最好是记录所有操作并过滤出历史记录。 - Sam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接