簡體   English   中英

如何刪除帶有外鍵約束的記錄?

[英]How to delete a record with a foreign key constraint?

啟動一個新的 ASP.NET MVC 3 應用程序並收到以下錯誤:

無法刪除主鍵值,因為對該鍵的引用仍然存在。

如何解決這個問題?

模型(EF 代碼優先)

public class Journal
{
    public int JournalId { get; set; }
    public string Name { get; set; }
    public virtual List<JournalEntry> JournalEntries { get; set; }
}
public class JournalEntry
{
    public int JournalEntryId { get; set; }
    public int JournalId { get; set; }
    public string Text { get; set; }
}

控制器

//
// POST: /Journal/Delete/5

[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed(int id)
{            
    Journal journal = db.Journals.Find(id);
    db.Journals.Remove(journal);
    db.SaveChanges(); // **exception occurs here**
    return RedirectToAction("Index");
}

數據庫設置

public class FoodJournalEntities : DbContext
{
    public DbSet<Journal> Journals { get; set; }
    public DbSet<JournalEntry> JournalEntries { get; set; }
}

找到了解決辦法:

public class FoodJournalEntities : DbContext
{
    public DbSet<Journal> Journals { get; set; }
    public DbSet<JournalEntry> JournalEntries { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Journal>()
               .HasOptional(j => j.JournalEntries)
               .WithMany()
               .WillCascadeOnDelete(true);
        base.OnModelCreating(modelBuilder);
    }
}

來源

如果您從表中刪除一條記錄(可以說“等等”),它與其他表(xyz,abc)有其他關系。 默認情況下,如果其他表之一中有相關行,數據庫將阻止您刪除“blah”中的行。
解決方案#1:
您可以先手動刪除相關行,這可能需要大量工作。
解決方案#2:
一個簡單的解決方案是將數據庫配置為在刪除“blah”行時自動刪除它們。

按照這個打開你的數據庫圖,然后點擊關系上的屬性

在此處輸入圖片說明

在 Properties 窗口中,展開INSERTUPDATE Specification 並將DeleteRule屬性設置為 Cascade。
在此處輸入圖片說明

保存並關閉圖表。 如果系統詢問您是否要更新數據庫,請單擊是。

為了確保模型使內存中的實體與數據庫正在執行的操作保持同步,您必須在數據模型中設置相應的規則。 打開 SchoolModel.edmx,右鍵單擊“blah”和“xyz”之間的關聯線,然后選擇“屬性”。

在 Properties 窗口中,展開INSERTUPDATE Specification 並將DeleteRule屬性設置為 Cascade。

解決方案和圖片取自http://www.asp.net/web-forms/tutorials/getting-started-with-ef/the-entity-framework-and-aspnet-getting-started-part-2

在 EF Core (3.1.8) 中,語法與接受的答案略有不同,但總體思路相同,對我有用的內容如下:

modelBuilder.Entity<Journal>()
            .HasMany(b => b.JournalEntries)
            .WithOne()
            .OnDelete(DeleteBehavior.Cascade);

在您選擇要從數據庫中刪除或刪除的項目的查詢中,您要確保明確包含這些項目,否則它將繼續拋出 FK 錯誤,如下所示。

var item = _dbContext.Journal.Include(x => x.JournalEntries).SingleOrDefault(x => x.Id == id);

我找到了...

轉到 SQL Server

使他的數據庫圖表化

右擊父子關系線,打開它的屬性。

設置 INSERT And Update Specification 並簡單地設置 DELETE RULE TO CASCADE。

請記住,為此目的在項目中不需要任何代碼,只需調試並享受它。

暫無
暫無

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

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