2009-09-29 2 views
0

내 도메인 모델에서 ILoggable 객체를위한 IInterceptor를 설정했다. OnFlushDirty 이벤트에서 로그 (감사)를 저장하려고합니다. 그러나 이렇게하면서 코드는 무한 루프로 진행됩니다.NHibernate IInterceptor에 객체 저장하기

_logrepository.Save (로그) 로그가 ILoggable 객체가없는 경우에도 OnFlushDirty를 호출

(다른 세션을 열지 않고) .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 (log)가 다른 트랜잭션을 열고 커밋하는 것이 었습니다. 그래서 logrepository.Save (log)를 열고 다른 트랜잭션을 커밋하지 않고 열린 트랜잭션을 사용하도록 변경했습니다.

관련 문제