如何捕获 DbUpdateException 独特的异常?

Jam*_*mes 3 c# sql-server entity-framework exception asp.net-core

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

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

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

例外情况

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

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

Hen*_*naz 6

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

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