【发布时间】:2012-08-17 15:34:09
【问题描述】:
我们有一个使用 NHibernate 作为 ORM 的 Web 应用程序,现在我们需要对一些实体添加审计以跟踪谁更改了哪些内容。但是,我还没有想出最好和最简单的方法来处理它。
如果可能,我希望将审计信息放入每个实体的单独表中,如下所示(伪 sql):
create table MethodStatus (MethodId, Enabled)
create table MethodStatusAudit (MethodId, Enabled, AdminId, Date, ChangeType(U,D,I))
问题是如何使用 (Fluent)NHibernate 进行设置,使其易于管理?
我最初的想法是使用 IPreInsertEventListener / IPreUpdateEventListener / IPreDeleteEventListener 并让我的可审计对象实现 IAuditable 接口,然后做一些事情。但我不知道如何保存审计..
public interface IAuditable {}
public class MethodStatus : IAuditable
{
public virtual int MethodId { get; set; }
public virtual bool Enabled { get; set; }
}
public class MethodStatusMap : ClassMap<MethodStatus>
{
public MethodStatusMap()
{
Id(x => x.MethodId);
Map(x => x.Enabled);
}
}
public bool OnPreInsert(PreInsertEvent @event)
{
var e = @event.Entity as IAuditable;
if (e != null)
//save audit.. but how?
}
【问题讨论】:
-
这是在数据库中使用触发器更容易完成的事情。这不适合你吗?
-
可以从@event 获取会话对象。你能用它保存你的新对象吗?
-
@DanielHilgarth 实际上我首先创建了一个基于触发器的解决方案,但我们更愿意在 c# 代码中保留它。当其他一切都在 C# 代码中时,触发器解决方案将对开发人员非常“隐藏”。这也会产生一些问题,因为我们需要发送数据库以某种方式不知道的 adminId,以便可以将其插入到审计表中。
标签: c# nhibernate fluent-nhibernate audit