NHibernate拦截器,审计和记录到数据库

时间:2016-06-17 00:01:22

标签: nhibernate fluent-nhibernate audit-trail

我正在使用这段代码作为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 
            }
        }
    }

有人可以指导我如何解决此问题以及如何将更改记录到数据库中。

2 个答案:

答案 0 :(得分:1)

不要开始新事务并将其提交到NHibernate拦截器中,因为事务已经打开并且在拦截器完成其工作后将提交,所有你想要做的就是删除using (ITransaction transaction = @event.Session.BeginTransaction())并删除transaction.Commit();并且事情会好起来的。

答案 1 :(得分:0)

问题是当您保存审计条目时,它会尝试为第一个审计条目创建另一个审计日志条目并重复该条目。修复方法是检查目标表是否为审计日志表,如果是这种情况则不创建条目。