[英]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 窗口中,展開INSERT和UPDATE Specification 並將DeleteRule屬性設置為 Cascade。
保存並關閉圖表。 如果系統詢問您是否要更新數據庫,請單擊是。
為了確保模型使內存中的實體與數據庫正在執行的操作保持同步,您必須在數據模型中設置相應的規則。 打開 SchoolModel.edmx,右鍵單擊“blah”和“xyz”之間的關聯線,然后選擇“屬性”。
在 Properties 窗口中,展開INSERT和UPDATE Specification 並將DeleteRule屬性設置為 Cascade。
在 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.