我需要为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);
}
也许我错过了什么?
答案 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客户端启用批处理时,它似乎没有被调用,所以我仍然认为在启用批处理时转换器会被破坏。