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