2009-09-29 5 views
0

Я установил IInterceptor для объектов ILoggable в моей модели домена. И в событии OnFlushDirty, я пытаюсь сохранить журнал (аудит). Но при этом мой код переходит в бесконечный цикл.Сохранение объектов в NHibernate IInterceptor

_logrepository.Save (журнал) вызывает OnFlushDirty даже если журнал не ILoggable объекта (это потому, что объект еще предыдущий объект)

Есть ли способ использовать .save (без открытия другого сеанса) в IInterceptor, или как мне вставить журнал в базу данных в IInterceptor?


public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types) 
    { 
     //find diffs, log each change 
     if (entity is ILoggable && entity is NamedEntity) 
     { 
     var namedEntity = entity as NamedEntity; 
     for (var i = 0; i < currentState.Count(); i++) 
     { 
      if (currentState[i] != previousState[i]) 
      { 
      var log = new Log() 
         { 
          Description = "update", 
          InDate = namedEntity.ModifiedDate.Value, 
          ItemId = namedEntity.Id, 
          ItemType = namedEntity.GetType().Name, 
          NewValue = currentState[i].ToString(), 
          OldValue = previousState[i].ToString(), 
          PropertyName = propertyNames[i], 
          UserId = namedEntity.ModifiedByUserId.Value 
         }; 

      // calling save calls onflushdirty again, where entity is not log, but the same entity of the first call 
      ObjectFactory.GetInstance().Save(log); 
      } 
     } 
     } 
     return base.OnFlushDirty(entity, id, currentState, previousState, propertyNames, types); 
    } 

ответ

0

ки, я понял это, моя проблема была _logrepository.Save (журнал) открывала ДРУГУЮ сделку и ее совершала. Итак, я изменил logrepository.Save (log), чтобы не открывать и не совершать другую транзакцию, а использовать открытую транзакцию.

Смежные вопросы