[英]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.