2016-06-17 6 views
1

Я использую этот кусок кода как часть моего класса AuditTrail, но перед попыткой зарегистрировать изменения в базе данных я столкнулся с execOverFlow Exception.NHibernate Interceptor, аудит и ведение журнала в базе данных

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 
      } 
     } 
    } 

Может ли кто-нибудь объяснить мне, как решить эту проблему, и как я могу регистрировать изменения в базе данных.

+0

Я думаю, ваше пространство имен не начинается с 'Averma.Fda.Domain'. Таким образом, появляется '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'который, Бесконечная история. Вам лучше отладить его и проверить, куда идет нежелательный цикл. Должно быть легко найти. – C4u

ответ

1

Не начать новую транзакцию и совершить его в перехватчик NHibernate, так как транзакция уже открыта и будет совершено после того, как перехватчик заканчивает свою работу, все, что вы хотите сделать, это удалить using (ITransaction transaction = @event.Session.BeginTransaction()) и удалить transaction.Commit(); и вещи будет в порядке.

0

Проблема заключается в том, когда вы сохраняете запись аудита, она пытается создать другую запись журнала аудита для первой записи аудита и повторяет ее. Исправление будет состоять в том, чтобы проверить целевую таблицу как таблицу журнала аудита, а не создавать запись, если это так.