2009-09-29 10 views
0

J'ai mis en place un IInterceptor pour les objets ILoggable dans mon modèle de domaine. Et sur l'événement OnFlushDirty, j'essaie d'enregistrer un journal (audit). Mais en faisant cela, mon code va dans une boucle infinie.Enregistrer des objets dans NHibernate IInterceptor

_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) en IInterceptor, ou comment 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); 
    } 

Répondre

0

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

Questions connexes