我需要对删除级联进行彻底的解释,因为这给我带来了不必要的麻烦。我有一个类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; }
}
我期待的行为是,如果我删除评论,它不应该影响父母新闻,但如果我删除新闻,我认为没有任何理由保留儿童评论,所以应该删除评论。 我在包管理器控制台中运行了一个更新数据库命令,我一直收到此错误
介绍FOREIGN KEY约束'FK_dbo.Comments_dbo.News_NewsId' 在表''评论'可能会导致周期或多个级联路径。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他 FOREIGN KEY约束。无法创建约束。见前 错误。 我该如何解决这个问题?
答案 0 :(得分:1)
当通过删除一个实体时,会导致此错误,另一个实体将被删除一次。
在您的方案中,如果删除了启用了级联删除的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);