NHibernate拦截器,审核并记录到数据库

NHibernate拦截器,审核并记录到数据库,nhibernate,fluent-nhibernate,audit-trail,Nhibernate,Fluent Nhibernate,Audit Trail,我使用这段代码作为auditTrail类的一部分,但是当我尝试记录对数据库的更改时,遇到了stackOverFlow异常 public void OnPostInsert(NHibernate.Event.PostInsertEvent @event) { if (!(@event.Entity is IAuditable)) { using (ITransaction transaction = @event.Session.Be

我使用这段代码作为auditTrail类的一部分,但是当我尝试记录对数据库的更改时,遇到了stackOverFlow异常

public void OnPostInsert(NHibernate.Event.PostInsertEvent @event)
    {
        if (!(@event.Entity is IAuditable))
        {
            using (ITransaction transaction = @event.Session.BeginTransaction())
            {

                if (@event.State != null)
                {
                    for (int i = 0; i < @event.State.Length; i++)
                    {
                        string propertyName = @event.Persister.PropertyNames[i];
                        if (@event.State[i] != null)
                        {
                            if (@event.State[i].GetType().Namespace.StartsWith("Averma.Fda.Domain"))
                            {
                                CompareIfOldStateIsNull(@event.State[i], Convert.ToInt32(@event.Id), @event.Entity.GetType().ToString(), @event.Session, false);
                            }
                            else
                            {
                                string auditEntry = "New value for " + SplitPropertyName(propertyName) + " has been added, the new value is " + @event.State[i];
                                @event.Session.Save(new AuditTrail() { AuditEntry = auditEntry, RelatedEntityId = Convert.ToInt32(@event.Id), RelatedEntityType = @event.Entity.GetType().ToString(), OperationType = Shared.Enums.OperationType.Insert });
                            }
                        }
                    }
                }
                transaction.Commit();//the error occurs here 
            }
        }
    }
public void OnPostInsert(NHibernate.Event.PostInsertEvent@Event)
{
如果(!(@event.Entity是IAuditable))
{
使用(ITransaction transaction=@event.Session.BeginTransaction())
{
如果(@event.State!=null)
{
对于(int i=0;i<@event.State.Length;i++)
{
字符串propertyName=@event.Persister.PropertyNames[i];
if(@event.State[i]!=null)
{
if(@event.State[i].GetType().Namespace.StartsWith(“Averma.Fda.Domain”))
{
CompareIfOldStateIsNull(@event.State[i],Convert.ToInt32(@event.Id),@event.Entity.GetType().ToString(),@event.Session,false);
}
其他的
{
string auditEntry=“已添加“+SplitPropertyName(propertyName)+”的新值,新值为“+@event.State[i];
@event.Session.Save(new AuditTrail(){AuditEntry=AuditEntry,RelatedEntityId=Convert.ToInt32(@event.Id),RelatedEntityType=@event.Entity.GetType().ToString(),OperationType=Shared.Enums.OperationType.Insert});
}
}
}
}
transaction.Commit();//此处发生错误
}
}
}

有谁能告诉我如何解决这个问题以及如何将更改记录到数据库中。

不要开始新事务并在NHibernate拦截器中提交,因为事务已经打开,并且将在拦截器完成其工作后提交,您要做的就是使用(ITransaction transaction=@event.Session.BeginTransaction())并删除
transaction.Commit()
一切都会好起来。

问题是,当您保存审核条目时,它会尝试为第一个审核条目创建另一个审核日志条目,并且会重复。解决方法是检查目标表是否为审核日志表,如果是这样,则不创建条目。

我猜您的命名空间不是以
Averma.Fda.Domain 。因此,
else
部分将进入,看起来,它使用了一个
Insert
,它将触发
OnPostInsert
。这是一个永无止境的故事。您应该调试它并检查不需要的循环进入的位置。应该很容易找到。