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
方法。
在您的子类中,您可以覆盖 OnPostDelete
、OnPostInsert
、OnPostRecreateCollection
、OnPostUpdate
、OnPreRemoveCollection
和 OnPreUpdateCollection
。在你的情况下,你应该检查 evt.Entity
和 evt.AffectedOwnerOrNull
。如果你想审计,只需调用基本方法,如果你不想审计,在你的实现中什么都不做。
但是请注意,如果您只是使用 Envers 进行简单的日志记录,您可能应该这样做。如果您使用它来重新创建历史实例,"removing" 审计某些历史事件可能会导致加载历史实例时出现问题。如果你是这种情况,那么只有当一个实体在其整个生命周期中有或没有 Orders
时才安全。
我有一个非常具体的审计需求。
考虑以下 class(为了简单起见,我更改了 classes 的名称并删减了不必要的代码)
[Audited]
public class Client
{
[NotAudited]
public virtual IList<Order> Orders {get; set;}
}
仅当订单 属性 不为空时才应审核客户实体。
这可能吗?如果是这样,我该怎么做?
如果您想根据某些状态在运行时关闭审计,您可以创建自己的 AuditEventListener
自定义子类并将该类型的实例传递给 IntegrateWithEnvers
方法。
在您的子类中,您可以覆盖 OnPostDelete
、OnPostInsert
、OnPostRecreateCollection
、OnPostUpdate
、OnPreRemoveCollection
和 OnPreUpdateCollection
。在你的情况下,你应该检查 evt.Entity
和 evt.AffectedOwnerOrNull
。如果你想审计,只需调用基本方法,如果你不想审计,在你的实现中什么都不做。
但是请注意,如果您只是使用 Envers 进行简单的日志记录,您可能应该这样做。如果您使用它来重新创建历史实例,"removing" 审计某些历史事件可能会导致加载历史实例时出现问题。如果你是这种情况,那么只有当一个实体在其整个生命周期中有或没有 Orders
时才安全。