2010-06-28 5 views
2

J'ai besoin d'écrire un peu de logique métier avant de vider toutes les entités modifiées. L'une des solutions que j'ai essayées est IPreUpdateEventListener. Mais cet écouteur d'événement possède déjà un objet dénormalisé en valeur-clé. J'ai besoin de quelque chose avant la dénormalisation et même avant le flush. Donc, la question est de savoir comment obtenir la liste des entités modifiées (diry).Comment obtenir la liste des entités modifiées (sales) de la session Nhibernate?

Répondre

1

Vous pouvez regarder l'événement Flush. Mais qu'est-ce que vous essayez d'accomplir, exactement?

+0

Merci, événement de chasse semble pourrait fonctionner. Il a IEventSource comme argument, et eventSource.PersistenceContext.EntityEntries.Keys est toutes les entités modifiées. Tout ce matériel nécessaire pour mettre à jour les "vues" des entités. Les vues sont simplement des données dénormalisées des événements principaux, elles ont aussi des références, c'est pourquoi je ne peux pas utiliser IPreUpdateEventListener. –

+0

'PersistenceContext.EntityEntries' n'est pas une entité modifiée. Ce sont les entités qui ont été chargées par la session en cours (eventSource). Peu importe s'ils ont été modifiés ou non, ils seront toujours dans EntityEntries. – Chaulky

1

Eh bien, la meilleure solution que j'ai trouvée utilise PersistenceContext.

foreach (var entity in eventSource.PersistenceContext.EntityEntries.Keys) 
{ 
    // entity is entity to update... 
} 

Vous ne savez pas si c'est la bonne solution, cependant.

3

Mon code pour détecter des entités sales

 var dirtyObjects = new List<object>(); 
     var sessionImpl = hsession.GetSessionImplementation(); 
     foreach (NHibernate.Engine.EntityEntry entityEntry in sessionImpl.PersistenceContext.EntityEntries.Values) 
     { 
      var loadedState = entityEntry.LoadedState; 
      var o = sessionImpl.PersistenceContext.GetEntity(entityEntry.EntityKey); 
      var currentState = entityEntry.Persister.GetPropertyValues(o, sessionImpl.EntityMode); 
      if (entityEntry.Persister.FindDirty(currentState, loadedState, o, sessionImpl) != null) 
      { 
       dirtyObjects.Add(entityEntry); 
      } 
     } 
Questions connexes