2010-12-06 6 views
5
using (var tran = repository.Session.BeginTransaction()) 
{ 
    try 
    { 
     repository.Save(entity); 
     tran.Comit(); 
    } 
    catch(Exception) 
    { 
     tran.Rollback(); 
     throw; 
    }  
} 

using (var tran = repository.Session.BeginTransaction()) 
{ 
    try 
    { 
     repository.GetById(id); 
     tran.Comit(); 
    } 
    catch(Exception) 
    { 
     tran.Rollback(); 
     throw; 
    }  
} 

Lorsque je tente d'obtenir l'entité par Id après exception et tran.rollback() dans la première utilisation ... je reçois exception de mise à jour. Donc nhibernate essaie de mettre à jour l'entité de la première utilisation dans la deuxième utilisation.NHibernate état 3 session après rollback()

Pourquoi? J'ai fait le tran.Rollback. Dois-je faire Session.Clear() aussi?

Merci

Répondre

14

Selon l'API Hibernate, lors d'une session Hibernate lance une exception, vous devez fermer la session et créer un nouveau. En outre, lorsque vous annulez une transaction Hibernate, vous ne devez pas la valider plus tard ou vider la session - vous devez recommencer dans une nouvelle session. En particulier (et c'est un détail d'implémentation donc ne vous y fiez pas), après une restauration, la session Hibernate a toujours des entités créées/modifiées depuis le début de la transaction - Hibernate ne passe pas par vos entités et revient tous les changements que vous avez faits. Par conséquent, si vous annulez la transaction et videz la session, Hibernate validera les modifications d'entité que vous pensiez avoir annulées. Si vous allez jouer avec le feu en essayant de contourner ce comportement (par exemple en effaçant la Session), méfiez-vous. Il est préférable de recommencer avec une nouvelle session.

+1

Ok, mais ma session est gérée par contextemap ioc, et est par appel wcf. Si je dispose de la session alors j'aurai des erreurs ailleurs. – Luka

+0

Quelles exceptions obtenez-vous? Pouvez-vous essayer de les prévenir? Pouvez-vous les poster ici? – gdj

+0

Je reçois GenericAdoException, parce que j'essaie d'insérer une valeur en double, qui doit être unique. Mais ce n'est pas le sujet. J'ai besoin de savoir quelle est la meilleure pratique. Jusqu'à présent, j'ai une gestion des exceptions comme celle ci-dessus. Mais maintenant, je vois que cela ne suffira pas. – Luka