문제

도메인 모델에서 iloggable 객체에 대한 Iinterceptor를 설정했습니다. 그리고 Onflushdirty 이벤트에서, 나는 로그 (감사)를 저장하려고합니다. 그러나이 작업을 수행하는 동안 내 코드는 무한 루프로 들어갑니다.

_logrepository.save (log) 로그가 iloggable 객체가 아니더라도 Onflushdirty를 호출합니다 (엔티티가 여전히 이전 객체이기 때문입니다)

iinterceptor에서 .save (다른 세션을 열지 않고)를 사용하는 방법이 있습니까?


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);
    }
도움이 되었습니까?

해결책

알았어요 따라서 Logrepository.Save (로그)를 변경하여 다른 거래를 열지 않고 커밋하지 않고 공개 트랜잭션을 사용했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top