2009-10-06 9 views
3

Je dois enregistrer une exception personnalisée pour le dialecte NHibernate. J'ai mis en œuvre et enregistré ISqlExceptionConverter, comme indiqué dans les tests NHibernate. Mais lorsque l'exception dans le code se lève, il n'est pas converti. Mon code de conversion même n'appelle pas.Exception personnalisée utilisant NHibernate ISqlExceptionConverter

Mon code est très simple:

try 
{ 
     using (ISession sess = OpenSession()) 
     using (ITransaction tx = sess.BeginTransaction()) 
     { 
      .... 
      sess.Save(obj); // invalid object scheduled for inserting 
      ..... 
      tx.Commit(); // exception raises here 
     } 
} 

catch (UniquenessViolationException ex) 
{ 
// never came here, since exception was not converted and is of type 
HibernateException 

} 

Ma mise en œuvre de ISqlExceptionConverter:

public class SqlExceptionConverter : ISQLExceptionConverter 
{ 
     public Exception Convert(AdoExceptionContextInfo exInfo) 
     { 
       var sqlEx = ADOExceptionHelper.ExtractDbException 
(exInfo.SqlException) as SqlException; 
       if (sqlEx != null) 
       { 
         if (sqlEx.Number == 2627) 
           return new UniquenessViolationException(exInfo.Message, sqlEx, 
exInfo.Sql); 
       } 
       return SQLStateConverter.HandledNonSpecificException 
(exInfo.SqlException, exInfo.Message, exInfo.Sql); 
     } 

Peut-être que je raté quelque chose?

+0

Je viens de frapper un problème similaire où j'essaie de forcer une exception dans la pile dans un test unitaire; l'appel à Session.Flush lève l'OracleException natif et n'exécute pas la classe de convertisseur enregistrée. –

Répondre

3

Vous devez enregistrer le convertisseur d'exception.

Dans le code:

configuration.SetProperty(
    Environment.SqlExceptionConverter, 
    typeof(SqlExceptionConverter).AssemblyQualifiedName); 

Dans le fichier de configuration:

<property name="sql_exception_converter"> 
     Name.Space.SqlExceptionConverter, MyAssembly 
</property> 

Je n'ai pas essayé ce jusqu'à maintenant, juste regardé dans dans le code. J'espère que cela fonctionne, j'en aurai besoin aussi :-)

+0

Merci, j'ai enregistré le convertisseur. Je débogue également le code NHibernate. Il y a beaucoup d'endroits où la conversion fonctionne, mais elle ne fonctionne pas pendant la vidange de la session ... Pas sûr, est-ce par conception, ou j'ai raté quelque chose. –

+0

Quelle exception est levée par NH que vous prévoyez convertir? –

+0

NHibernate lève HibernateException. J'ai également placé le point d'arrêt à ma classe de convertisseur et le débogueur ne l'a pas frappé, cependant j'ai vérifié à l'exécution - mon convertisseur a été correctement enregistré à l'objet de configuration. –

0

Semble être a known issue in NH 2.1.2 GA, fixed in 3.0.0. Le patch a été appliqué en r4932. Cela étant dit, il semble qu'il ne soit pas appelé lorsque le traitement par lots est activé pour le client Oracle, donc je considérerais toujours le convertisseur comme cassé lorsque le traitement par lots est activé.

Questions connexes