Question

Je mis en place un IInterceptor pour les objets ILoggable dans mon modèle de domaine. Et sur l'événement OnFlushDirty, je suis en train d'enregistrer un journal (audit). Mais en faisant cela, mon code va dans une boucle infinie.

_logrepository.Save (journal) appelle OnFlushDirty même si journal n'est pas un objet ILoggable (c'est parce que l'entité est encore l'objet précédent)

Y at-il un moyen d'utiliser .Save (sans ouvrir une autre session) à IInterceptor, ou comment puis-je insérer un journal dans la base de données dans 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);
    }
Était-ce utile?

La solution

ok, j'ai tout compris, mon problème était _logrepository.Save (log) était d'ouvrir une autre opération et commiting elle. Alors, je l'ai changé logrepository.Save (log) de ne pas ouvrir et engager une autre transaction, mais utiliser une transaction ouverte.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top