2010-01-26 5 views
1

J'utilise NHibernate (v 2.1.0.4000) et j'essaie d'utiliser un écouteur d'événement pour une action de mise à jour.Les écouteurs Nhibernate ne fonctionnent pas correctement

J'ai utilisé le code suivant pour ajouter un écouteur à la configuration Nhibernate.

var configuration = new Configuration();  
configuration.SetListener(ListenerType.Update, new UpdateListener()); 
_sessionFactory = configuration.BuildSessionFactory(); 

Quand je mets à jour deux articles, le premier élément n'obtient pas à la fonction « PerformUpdate » de l'auditeur. Cependant, lors de la mise à jour du second élément, la fonction est appelée.

Comment cela est-il possible?

--- --- Edité

Lors du débogage j'ai découvert que sur le "OnSaveOrUpdate" du Listener, le code suivant est en cours d'exécution:

object obj4 = session.PersistenceContext.UnproxyAndReassociate(@event.Entity); 
@event.Entity = obj4; 
@event.Entry = session.PersistenceContext.GetEntry(obj4); 

Je m'y attendais @event. L'entrée était null, mais elle n'était pas nulle et avait un statut Loaded. Que devrait-il vraiment se passer lors de l'appel de la méthode GetEntry?

Répondre

0

Pouvez-vous montrer le code pour votre auditeur? Avez-vous utilisé un profileur pour vous assurer que des mises à jour sont émises pour les deux éléments? Je peux voir ceci se produire s'il n'y a aucune modification à un article ainsi aucune mise à jour n'est émise.

Édité pour ajouter: Je pense que vous utilisez l'ancienne implémentation du programme d'écoute. Je suggère d'utiliser le new style (il y a aussi ISaveOrUpdateEventListener). Implémentez-vous une fonction d'audit?

Je vous suggère également de vérifier qu'une mise à jour est émise pour le premier article. Je sais que vous avez dit que vous êtes sûr que cela a été changé, mais vous devriez également vérifier que NH pense que cela a été changé. C'est toujours une bonne idée d'éliminer les problèmes évidents lors du débogage de quelque chose comme ça.

+0

La seule fonction que j'ai dans le Listener est la suivante: protected override vide PerformUpdate (SaveOrUpdateEvent @event, entité objet, IEntityPersister persister) { Ce funtion est pas appelé. Je suis sûr que les deux objets sont changés. – Jan

+0

J'ai découvert que lorsque j'obtiens un objet, que je fais une modification et que je mets à jour l'objet, la fonction performUpdate de l'écouteur n'est jamais appelée. – Jan

Questions connexes