NHibernate Envers:基于 属性 值的审计实体

NHibernate Envers: Auditing entity based on property value

我有一个非常具体的审计需求。

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

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

仅当订单 属性 不为空时才应审核客户实体。

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

如果您想根据某些状态在运行时关闭审计,您可以创建自己的 AuditEventListener 自定义子类并将该类型的实例传递给 IntegrateWithEnvers 方法。

在您的子类中,您可以覆盖 OnPostDeleteOnPostInsertOnPostRecreateCollectionOnPostUpdateOnPreRemoveCollectionOnPreUpdateCollection。在你的情况下,你应该检查 evt.Entityevt.AffectedOwnerOrNull。如果你想审计,只需调用基本方法,如果你不想审计,在你的实现中什么都不做。

但是请注意,如果您只是使用 Envers 进行简单的日志记录,您可能应该这样做。如果您使用它来重新创建历史实例,"removing" 审计某些历史事件可能会导致加载历史实例时出现问题。如果你是这种情况,那么只有当一个实体在其整个生命周期中有或没有 Orders 时才安全。