Пользовательское исключение с использованием NHibernate ISqlExceptionConverter - PullRequest
3 голосов
/ 06 октября 2009

Мне нужно зарегистрировать пользовательское исключение для диалекта NHibernate. Я реализовал и зарегистрирован ISqlExceptionConverter, как показано в тестах NHibernate. Но когда исключение в коде бросает, это не преобразовано. Мой код конверсии даже не звонит.

Мой код действительно прост:

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

}

Моя реализация 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);
        } 

Может быть, я что-то пропустил?

Ответы [ 2 ]

3 голосов
/ 06 октября 2009

Вам необходимо зарегистрировать конвертер исключений.

В коде:

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

В конфигурационном файле:

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

Я не пробовал это до сих пор, просто заглянул в код. Надеюсь, это сработает, мне это тоже нужно: -)

0 голосов
/ 17 сентября 2010

Похоже, что известная проблема в NH 2.1.2 GA, исправленная в 3.0.0 . Патч был применен в r4932 . Тем не менее, похоже, что он не вызывается, когда пакетная обработка включена для клиента Oracle, поэтому я все равно считаю преобразователь неисправным при включенной пакетной обработке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...