簡體   English   中英

如何在 ASP.NET Core 6 代碼優先中刪除外鍵(級聯刪除)

[英]How to Delete ForeignKey (Cascade Delete) in ASP.NET Core 6 code-first

我有兩個模型,它們通過外鍵約束相互綁定。

  1. PurchaseOrder是父表
  2. PurchaseOrderQtyBreakDown是子表

現在的問題是當我試圖刪除父表時,出現了這個錯誤:

SqlException:DELETE 語句與 REFERENCE 約束“FK_POQtyBreakDown_PurchaseOrder_PurchaseOrderPoId”沖突。 沖突發生在數據庫“InfoSys_CommercialAPI”、表“dbo.POQtyBreakDown”、“PurchaseOrderPoId”列中

我嘗試了以下方法來實現Cascade Delete 但它不能正常工作。

DbContext

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
    {
    }

    // Commercial Tables
    // Back-To-Back
    public DbSet<PurchaseOrder> PurchaseOrder { get; set; }
    public DbSet<PurchaseOrderQtyBreakDown> POQtyBreakDown { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<PurchaseOrderQtyBreakDown>()
            .HasOne(s => s.PurchaseOrder)
            .WithMany(b => b.PurchaseOrderQtyBreakDown)
            .HasForeignKey(b => b.PurchaseOrderPoId)
            .OnDelete(DeleteBehavior.Cascade);

        base.OnModelCreating(modelBuilder);
    }
}

PurchaseOrderPurchaseOrderQtyBreakDown模型類如下所示:

public class PurchaseOrder
{
    [Key]
    public int PoId { get; set; }
    [DisplayName("CONTRACT")]
    public int? ContractListId { get; set; }
    [ForeignKey("ContractListId")]
    [ValidateNever]
    public ContractList? ContractList { get; set; }
    [DisplayName("ORDER NO")]
    [ValidateNever]
    public string? OrderNo { get; set; }
    public virtual List<PurchaseOrderQtyBreakDown> PurchaseOrderQtyBreakDown { get; set; } = new List<PurchaseOrderQtyBreakDown>();
}

public class PurchaseOrderQtyBreakDown
{
    public int Id { get; set; }

    public int? PurchaseOrderPoId { get; set; }
    [ForeignKey("PurchaseOrderPoId")]
    [ValidateNever]
    public PurchaseOrder? PurchaseOrder { get; set; }

    public int? ContractListId { get; set; }
    [ForeignKey("ContractListId")]
    [ValidateNever]
    public ContractList? ContractList { get; set; }

    public int? Qty { get; set; }

    public decimal? UnitPrice { get; set; }

    public string? OrderNo { get; set; }
}

請幫我解決這個問題。 非常感謝。

我從微軟文檔中得到了一個解決方案。 您只需要執行以下操作:

  1. 轉到數據庫
  2. 選擇子表
  3. 打開鑰匙
  4. 選擇要“級聯”的 FK 關系
  5. 右擊選擇修改
  6. 選擇插入和更新規范
  7. 選擇刪除規則
  8. 設置選項“級聯”
  9. 並保存。

從現在開始,您可以刪除父行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM