Domanda

ho creato un IInterceptor per gli oggetti ILoggable nel mio modello di dominio. E su eventi OnFlushDirty, sto cercando di salvare un log (audit). Ma mentre si fa questo, il mio codice entra in un ciclo infinito.

_logrepository.Save (log) chiama OnFlushDirty anche se di registro non è un oggetto ILoggable (è perché entità è ancora l'oggetto precedente)

C'è un modo per utilizzare .save (senza aprire un'altra sessione) in IInterceptor, o come posso inserire un registro nel database in 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);
    }
È stato utile?

Soluzione

ok, ho capito, il mio problema era _logrepository.Save (LOG) stava aprendo un'altra transazione e commettere esso. Così, ho cambiato logrepository.Save (log) di non aprire e commettere un altro transazione, ma utilizzare una transazione aperta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top