簡體   English   中英

關於在實體框架中級聯刪除的說明

[英]Explanation about Cascade on Delete in Entity Framework

我需要對刪除級聯進行徹底的解釋,因為它使我不必要地頭痛。 我有一類News.cs和一類Comment.cs。 新聞有評論集,評論必須屬於新聞,因此我像下面這樣設置班級

public class News
{
    public int NewsId { get; set; }

    [Display(Name = "Title")]
    public string Title { get; set; }

    [Display(Name = "Details")]
    public string Details { get; set; }

    public DateTime DateCreated { get; set; }

    public int AppUserId { get; set; }

    [ForeignKey("AppUserId")]
    public virtual AppUser AppUser { get; set; }

    public ICollection<Comment> Comment { get; set; }

}

public class Comment
{
    public int CommentId { get; set; }

    public string CommentText { get; set; }

    public DateTime DateCreated { get; set; }

    public int AppUserId  { get; set; }

    public int NewsId { get; set; }

    [ForeignKey("AppUserId")]
    public virtual AppUser User { get; set; }

    [ForeignKey("NewsId")]
    public virtual News News { get; set; }

}

我期望的行為是,如果我刪除評論,則不會影響父級新聞,但是如果刪除新聞,我看不到保留子級評論的任何理由,因此應刪除評論。 我在程序包管理器控制台中運行了一個更新數據庫命令,但不斷出現此錯誤

在表“注釋”上引入外鍵約束“ FK_dbo.Comments_dbo.News_NewsId”可能會導致循環或多個級聯路徑。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。 無法創建約束。 請參閱先前的錯誤。 我該如何解決這個問題?

通過刪除一個實體,另一個實體將被刪除一次以上,就會導致此錯誤。

在您的方案中,如果在啟用級聯刪除的情況下刪除AppUser,這將嘗試刪除相關實體(新聞和評論)。 由於評論也依賴於新聞,因此刪除新聞時,評論也將作為從屬而被刪除。 由於對AppUser的依賴關系,它可能已被刪除,因此SQL無法保證該實體現在存在,因此SQL Server首先將阻止您實現該實體。

要解決此問題,最簡單的方法是通過流暢的api關閉一個或多個依賴項上的級聯刪除:

modelBuilder.Entity<AppUser>().HasMany(au => au.Comments)
.WithRequired(c => c.AppUser)
.HasForeignKey(c => c.AppUserID)
.WillCascadeOnDelete(false);

modelBuilder.Entity<AppUser>().HasMany(au => au.News)
.WithRequired(n => n.AppUser)
.HasForeignKey(n => n.AppUserID)
.WillCascadeOnDelete(false);

暫無
暫無

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

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