C# 使用nhibernate将审核日志复制到重复表

C# 使用nhibernate将审核日志复制到重复表,c#,nhibernate,fluent-nhibernate,audit,C#,Nhibernate,Fluent Nhibernate,Audit,我们有一个web应用程序,使用NHibernate作为ORM,现在我们需要在一些实体上添加审计,以跟踪谁改变了什么。然而,我还没有找到最好、最简单的处理方法 如果可能的话,我希望审计信息进入每个实体的一个单独的表中,类似这样(伪sql): 问题是如何使用(Fluent)NHibernate设置它,使其易于管理 我最初的想法是使用IPreInsertEventListener/IPreUpdateEventListener/IPreDeleteEventListener,让我的可审核对象实现IAA

我们有一个web应用程序,使用NHibernate作为ORM,现在我们需要在一些实体上添加审计,以跟踪谁改变了什么。然而,我还没有找到最好、最简单的处理方法

如果可能的话,我希望审计信息进入每个实体的一个单独的表中,类似这样(伪sql):

问题是如何使用(Fluent)NHibernate设置它,使其易于管理

我最初的想法是使用IPreInsertEventListener/IPreUpdateEventListener/IPreDeleteEventListener,让我的可审核对象实现IAAuditable接口,然后做一些事情。但是我想不出如何保存审计

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? 
}
公共接口IAuditable{}
公共类方法状态:IAuditable
{
公共虚拟int MethodId{get;set;}
启用公共虚拟bool的{get;set;}
}
公共类方法状态映射:类映射
{
公共方法状态映射()
{
Id(x=>x.MethodId);
映射(x=>x.Enabled);
}
}
公共bool OnPreInsert(PreInsertEvent@event)
{
var e=@event.Entity作为IAuditable;
如果(e!=null)
//保存审计..但如何保存?
}

可以帮助您实现这一点。

在数据库中使用触发器更容易实现这一点。这不是您的一个选项吗?您可以从@event获取会话对象。你能用它保存你的新对象吗?@DanielHilgarth我实际上首先创建了一个基于触发器的解决方案,但我们更愿意在c代码中保持它。当其他一切都在C#代码中时,触发器解决方案将对开发人员非常“隐藏”。这也会产生一些问题,因为我们需要以某种方式发送数据库不知道的adminId,以便将其插入审计表中。
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? 
}