簡體   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