C# 在ASP.NET核心MVC控制器中捕获带有DeleteConfirmed类的SqlException 547时出现问题
我在简单数据库表(C# 在ASP.NET核心MVC控制器中捕获带有DeleteConfirmed类的SqlException 547时出现问题,c#,asp.net-core,entity-framework-core,asp.net-core-mvc,C#,Asp.net Core,Entity Framework Core,Asp.net Core Mvc,我在简单数据库表(Products)上有标准的MVC控制器,带有相应的Model和所有视图(Index、Detail、Edit和Delete)。 如果记录没有外键约束,所有功能都可以正常工作 我已经在控制器中修改了deleteConfixed类,以便能够捕获当有人试图删除具有外键约束的记录时发生的SqlException 这是我现在在Controller中的deleteConfirmmed类: //POST:Products/Delete/5 [HttpPost,ActionName(“删除”)
Products
)上有标准的MVC控制器,带有相应的Model
和所有视图(Index、Detail、Edit和Delete
)。
如果记录没有外键约束,所有功能都可以正常工作
我已经在控制器中修改了deleteConfixed
类,以便能够捕获当有人试图删除具有外键约束的记录时发生的SqlException
这是我现在在Controller中的deleteConfirmmed
类:
//POST:Products/Delete/5
[HttpPost,ActionName(“删除”)]
[ValidateAntiForgeryToken]
公共异步任务删除已确认(int-id)
{
尝试
{
var products=wait_context.products.FindAsync(id);
_context.Products.Remove(产品);
wait_context.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
当(ex.Number==547)时捕获(SqlException ex)
{
退货内容(“产品无法删除,因为…”);
}
}
但它仍然抛出异常:
处理请求时发生未处理的异常。
SqlException:DELETE语句与引用冲突
约束“FK…”。冲突发生在
数据库“存储”,表“…”列
'...'. 声明已终止
原始异常详细信息显示它实际上是异常547:
Microsoft.Data.SqlClient.SqlException(0x80131904):删除
语句与引用约束“…”冲突。冲突
发生在数据库“存储”、表“…”和列“…”中。声明
已经终止。在
Microsoft.Data.SqlClient.SqlCommand.c.b__164_0(任务'1
结果)错误编号:547,状态:0,类别:16
我做错了什么?错的是代码的逻辑 异常应该是异常的,而不是在应用程序的正常流程中发生的。外键冲突是您理所当然会想到的事情,因此不是例外
因此,与其等待异常发生并对其作出反应,不如通过检查要删除的
产品
是否与另一个实体存在外键关系来保持主动。如果是这样,请不要尝试删除,并显示“产品无法删除”消息。您正在尝试从另一个表中有引用的表中删除记录
当您尝试从Products表中删除一行时,它会知道同一行在另一个表中有一些相关行(它在“FK_Products_u……)异常错误的末尾显示了第二个表的名称)
因此,您需要先从第二个表中删除,然后从产品表中删除。我会这样做,这将解决问题。但是为什么我不能显示简单的文本消息而不是已知的异常?很抱歉,我的回答没有帮助,我没有意识到您的问题的重点是异常而不是缺点培训本身我没有给你-1,我认为你的回答也很有帮助。