如何捕获 DbUpdateException 唯一异常?

时间:2021-01-13 04:41:19

标签: c# sql-server entity-framework asp.net-core exception

当标签已经存在于标签表中时,我将其插入,因此它返回消息,

<块引用>

消息“无法在具有唯一索引“IX_Tag_Name”的对象“dbo.Tag”中插入重复的键行。重复的键值为 (Lemon)。\r\n语句已终止。”字符串

我已尝试通过检查 Number 2601 来捕获此唯一异常,但无法访问 Number 属性。

The Exception

显然,这就是您假设捕获异常的方式,但 ex.InnerException.InnerException 为空,因此 switch 语句永远不会执行。 How can I catch UniqueKey Violation exceptions with EF6 and SQL Server?

catch (DbUpdateException ex)
{
    if (ex.InnerException.InnerException is SqlException sqlException)
    {
        switch (sqlException.Number)
        {
            // If the tag already exists
            case 2601: // Unique Key violation
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您的代码正在检查内部异常的内部异常。这是空的,因此您的代码失败。而是这样做:

         catch (DbUpdateException ex)
        {
            if (ex.InnerException is SqlException sqlException)
            {
                switch (sqlException.Number)
                {
                    // If the tag already exists
                    case 2601: // Unique Key violation
                }
            }
        }