实体框架:如何正确处理SQL约束导致的异常?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (21)

我使用实体框架访问SQL数据。我在数据库模式中有一些约束,我想知道如何处理这些约束引起的异常。

例如,在两个用户试图同时向DB添加一个(几乎)相同实体的情况下,我得到了以下异常。

System.Data.UpdateException
"An error occurred while updating the entries. See the InnerException for details."

(inner exception) System.Data.SqlClient.SqlException
"Violation of UNIQUE KEY constraint 'Unique_GiftId'. Cannot insert duplicate key in object 'dbo.Donations'.\r\nThe statement has been terminated."

如何正确地捕获此特定异常?

    catch (UpdateException ex)
    {
        SqlException innerException = ex.InnerException as SqlException;
        if (innerException != null && innerException.Message.StartsWith("Violation of UNIQUE KEY constraint 'Unique_GiftId'"))
        {
            // handle exception here..
        }
        else
        {
            throw;
        }
    }

现在,虽然这种方法奏效了,但它也有一些缺点:

  • 没有类型安全性:代码依赖于异常消息,其中包含唯一列的名称。
  • 依赖于SqlCLient类(中断的抽象)
提问于
用户回答回答于

您应该能够捕获sql错误号

在本例中,它是2627,这对于SQLServer来说一直是一样的。

如果您想要抽象,那么您将始终对数据库引擎有一些依赖,因为每个引擎都会抛出不同的异常号和消息。

用户回答回答于

一种方法是从内部SqlException检查误差性质。SqlError类有一个数字属性它可以识别准确的错误。有关所有错误代码的列表,请参见master.dbo.sysmessages表。

扫码关注云+社区