Frage

Ich habe in meinem Domänenmodell einen iInterceptor für ilooggable Objekte eingerichtet. Und bei OnflushDirty -Event versuche ich, ein Protokoll (Audit) zu speichern. Aber dabei geht mein Code in eine unendliche Schleife.

_logrpository.save (log) ruft onflushDirty auf, auch wenn Protokoll kein ilooggierbares Objekt ist (es liegt daran, dass Entität immer noch das vorherige Objekt ist)

Gibt es eine Möglichkeit, .Save (ohne eine andere Sitzung) in IInterceptor zu verwenden, oder wie füge ich ein Protokoll in die Datenbank in iInterceptor ein?


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);
    }
War es hilfreich?

Lösung

Ok, ich habe es herausgefunden, mein Problem war _logrpository.save (log) öffnete eine weitere Transaktion und begann sie. Also habe ich logrepository geändert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top