[英]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.