NHibernate 拦截器,审计和记录到数据库
NHibernate Interceptor , auditing and logging to the database
我将这段代码用作我的 auditTrail 的一部分 Class 但是当我尝试将更改记录到数据库时遇到 Whosebug 异常。
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
}
}
}
谁能指导我如何解决这个问题以及如何将更改记录到数据库中。
不要开始新的事务并在 NHibernate 拦截器中提交它,因为事务已经打开并将在拦截器完成其工作后提交,您要做的就是删除 using (ITransaction transaction = @event.Session.BeginTransaction())
和删除 transaction.Commit();
一切都会好起来的。
问题是当您保存审计条目时,它会尝试为第一个审计条目创建另一个审计日志条目并重复。修复方法是检查目标 table 是否为审计日志 table,如果是这种情况则不创建条目。
我将这段代码用作我的 auditTrail 的一部分 Class 但是当我尝试将更改记录到数据库时遇到 Whosebug 异常。
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
}
}
}
谁能指导我如何解决这个问题以及如何将更改记录到数据库中。
不要开始新的事务并在 NHibernate 拦截器中提交它,因为事务已经打开并将在拦截器完成其工作后提交,您要做的就是删除 using (ITransaction transaction = @event.Session.BeginTransaction())
和删除 transaction.Commit();
一切都会好起来的。
问题是当您保存审计条目时,它会尝试为第一个审计条目创建另一个审计日志条目并重复。修复方法是检查目标 table 是否为审计日志 table,如果是这种情况则不创建条目。