繁体   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