Как получить правильное исключение из ADO.NET о нарушении внешнего ключа - PullRequest
1 голос
/ 27 августа 2010

Я хотел бы получить правильное Исключение из ADO.NET о нарушении внешнего ключа.Есть ли способ сделать это?

Я использую попытку поймать ADO.Exception и проверить его текст сообщения на «чужой».Итак, если в тексте исключения есть «чужой» текст, это нарушение, и я могу предупредить.

Это правильный способ или любой другой метод?

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 Ответ

1 голос
/ 27 августа 2010

Вы можете сделать это, создав класс, который реализует интерфейс 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>

В целом, эта функция (более или менее) недокументирована, но вы можете найти некоторую информацию в блоге Фабио Мауло .

...