sauvegarde des objets dans NHibernate IInterceptor
-
18-09-2019 - |
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);
}
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.