Pergunta

Configurei um IInterceptor para objetos ILoggable em meu modelo de domínio.E no evento OnFlushDirty, estou tentando salvar um log (auditoria).Mas ao fazer isso, meu código entra em um loop infinito.

_logrepository.Save(log) chama OnFlushDirty mesmo se log não for um objeto ILoggable (é porque a entidade ainda é o objeto anterior)

Existe uma maneira de usar .Save (sem abrir outra sessão) no IInterceptor, ou como faço para inserir um log no banco de dados no 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);
    }
Foi útil?

Solução

ok, descobri, meu problema era _logrepository.Save(log) estava abrindo OUTRA transação e confirmando-a.Então, mudei logrepository.Save(log) para não abrir e confirmar outra transação, mas usar uma transação aberta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top