我想从ADO.NET获得有关外键冲突的正确异常。有没有办法做到这一点?
我正在使用try来捕获ADO.Exception并检查消息文本是否为“foreign”。因此,如果异常文本中存在“外来”文本,则表示违规,我可以提醒。
这是正确的做法还是其他方法?
try{
base.Delete();
IList<Issue> issues = Issue.LoadForX(this);
foreach (Issue issue in issues)
{
issue.X= null;
issue.SaveAndCheckChanged(user);
}
}
catch(NHibernate.ADOException exception)
{...
答案 0 :(得分:1)
您可以通过创建实现ISQLExceptionConverter
接口的类来完成此操作。
以下是SQL Server的示例实现:
Public Class MsSqlExceptionConverter
Implements ISQLExceptionConverter
Private Enum SqlServerError As Integer
ConstraintViolation = 2627
ConstraintConflict = 547
End Enum
Public Function Convert(ByVal adoExceptionContextInfo As Global.NHibernate.Exceptions.AdoExceptionContextInfo) As System.Exception _
Implements Global.NHibernate.Exceptions.ISQLExceptionConverter.Convert
Dim sqle As SqlException = TryCast(ADOExceptionHelper.ExtractDbException(adoExceptionContextInfo.SqlException), SqlException)
If sqle IsNot Nothing Then
Select Case sqle.Number
Case SqlServerError.ConstraintConflict
Return New ConstraintConflictException(InternalExceptionMessages.ConstraintConflictOccured, adoExceptionContextInfo.SqlException)
Case SqlServerError.ConstraintViolation
Return New ConstraintViolationException(InternalExceptionMessages.ConstraintViolationOccured, adoExceptionContextInfo.SqlException)
End Select
End If
Return SQLStateConverter.HandledNonSpecificException(adoExceptionContextInfo.SqlException, adoExceptionContextInfo.Message, adoExceptionContextInfo.Sql)
End Function
End Class
要使用它,请在NHibernate配置文件中定义它,如下所示:
<property name="sql_exception_converter">YourProduct.Infrastructure.NHibernate.ExceptionConverters.MsSqlExceptionConverter, YourProduct.Infrastructure</property>
总体而言,此功能(或多或少)未记录,但您可以在Fabio Maulo's blog上找到一些信息。