繁体   English   中英

在 ASP.NET Core MVC 控制器中使用 DeleteConfirmed 类捕获 SqlException 547 的问题

[英]Problem catching SqlException 547 with DeleteConfirmed class in ASP.NET Core MVC Controller

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

我已经修改了我的控制器中的DeleteConfirmed类,因此我可以捕获当有人尝试删除具有外键约束的记录时发生的SqlException

这是我现在在控制器中的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_...”冲突。 冲突发生在数据库“Store”、表“...”、“...”列中。 该语句已终止。

原始异常详细信息显示它确实是异常 547:

Microsoft.Data.SqlClient.SqlException (0x80131904):DELETE 语句与 REFERENCE 约束“...”冲突。 冲突发生在数据库“Store”、表“...”、“...”列中。 该语句已终止。 在 Microsoft.Data.SqlClient.SqlCommand.<>c.b__164_0(Task`1 result) ... ...错误编号:547,状态:0,类:16

我究竟做错了什么?

有什么问题是你的代码逻辑。

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

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

您正在尝试从另一个表中具有引用的表中删除记录。

当您尝试从Products Table 中删除一行时,它知道同一行在另一个 Table 中有一些相关的行(它在“FK_Products_(...)”异常错误的末尾说这个第二个表的名称.

因此,您需要先从第二个表中删除,然后再从Product表中删除。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM