Pregunta

I fijó un IInterceptor para objetos ILoggable en mi modelo de dominio. Y en caso OnFlushDirty, estoy tratando de guardar un registro (auditoría). Pero al hacer esto, mi código entra en un bucle infinito.

_logrepository.Save (registro) llama OnFlushDirty registro incluso si no es un objeto ILoggable (es porque la entidad sigue siendo el objeto anterior)

¿Hay una manera de utilizar .Save (sin necesidad de abrir otra sesión) en IInterceptor, o ¿Cómo se inserta un registro en la base de datos en 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);
    }
¿Fue útil?

Solución

bien, lo he descubierto, mi problema era _logrepository.Save (log) estaba abriendo otra transacción y cometer la misma. Por lo tanto, he cambiado logrepository.Save (registro) de no abrir y comprometerse otra transacción pero el uso de una transacción abierta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top