如何从ADO.NET获得有关外键冲突的正确异常

时间:2010-08-27 08:17:47

标签: nhibernate nhibernate-mapping

我想从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)
{...

1 个答案:

答案 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上找到一些信息。