【问题标题】:Problem catching SqlException 547 with DeleteConfirmed class in ASP.NET Core MVC Controller在 ASP.NET Core MVC 控制器中使用 DeleteConfirmed 类捕获 SqlException 547 时出现问题
【发布时间】:2021-01-03 10:48:42
【问题描述】:

我在简单数据库表 (Products) 上有标准 MVC 控制器,并带有相应的 Model 和所有视图 (Index, Detail, Edit and Delete)。 如果记录没有外键约束,所有功能都可以正常工作。

我已经在我的 Controller 中修改了 DeleteConfirmed 类,因此我可以捕捉到当有人试图删除具有外键约束的记录时发生的 SqlException

这是我现在在 Controller 中的 DeleteConfirmed 类:

// POST: Products/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DeleteConfirmed(int id)
{
    try
    {
        var products = await _context.Products.FindAsync(id);
        _context.Products.Remove(products);   
        await _context.SaveChangesAsync();
        return RedirectToAction(nameof(Index));             
    }
    catch (SqlException ex) when (ex.Number == 547)
    {
        return Content("Product cannot be deleted because...");
    }    
}

但它仍然抛出异常:

处理请求时发生未处理的异常。 SqlException:DELETE 语句与 REFERENCE 冲突 约束“FK_...”。冲突发生在 数据库“存储”,表“...”,列 '……'。声明已终止。

原始异常详细信息表明它确实是异常 547:

Microsoft.Data.SqlClient.SqlException (0x80131904):删除 语句与 REFERENCE 约束“...”冲突。冲突 发生在数据库“Store”、表“...”、列“..”中。该声明 已被终止。在 Microsoft.Data.SqlClient.SqlCommand.c.b__164_0(任务`1 结果)... ... 错误号:547,状态:0,类:16

我做错了什么?

【问题讨论】:

    标签: c# asp.net-core entity-framework-core asp.net-core-mvc


    【解决方案1】:

    你的代码逻辑有问题。

    异常应该是异常,而不是您期望在应用程序的正常流程中发生的事情。外键违规是理所当然的事情,因此也不例外。

    因此,与其等待异常发生并对其作出反应,不如主动检查要删除的Product 是否与另一个实体有外键关系.如果是这样,请不要尝试删除,并显示您的“产品无法删除”消息。

    【讨论】:

    • 我会这样做,它会解决问题。但是为什么我不能显示简单的文本消息而不是已知异常?
    【解决方案2】:

    您正试图从一个表中删除该记录,该表在另一个表中有引用。

    当您尝试从 Products 表中删除一行时,会发现同一行在另一个表中有一些相关行(它在表的末尾显示了第二个表的名称“FK_Products_(...)”异常错误。

    所以,你需要先从第二个表中删除,然后再从Product表中删除。

    【讨论】:

    • 对不起,我的回答没有帮助,我没有意识到您的问题的重点是异常而不是约束本身
    • 我没有给你 -1 ,我认为你的回答也有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多