使用NHibernate ISqlExceptionConverter的自定义异常

时间:2009-10-06 07:57:32

标签: nhibernate exception

我需要为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 个答案:

答案 0 :(得分:3)

您需要注册异常转换器。

在代码中:

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

在配置文件中:

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

我直到现在才尝试这个,只是查看了代码。希望它有效,我也需要它: - )

答案 1 :(得分:0)

似乎是a known issue in NH 2.1.2 GA, fixed in 3.0.0。该补丁已应用于r4932。这就是说,当为Oracle客户端启用批处理时,它似乎没有被调用,所以我仍然认为在启用批处理时转换器会被破坏。