首页 > 解决方案 > 如何捕获 DbUpdateException 唯一异常?

问题描述

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

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

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

例外

显然,这就是您假设捕获异常但ex.InnerException.InnerException 为空的方式,因此 switch 语句永远不会执行。 如何使用 EF6 和 SQL Server 捕获 UniqueKey Violation 异常?

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

标签: c#sql-serverentity-frameworkasp.net-coreexception

解决方案


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

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

推荐阅读