关于实体框架中删除的级联的解释

时间:2015-08-03 11:43:05

标签: c# sql asp.net asp.net-mvc 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; }

}

我期待的行为是,如果我删除评论,它不应该影响父母新闻,但如果我删除新闻,我认为没有任何理由保留儿童评论,所以应该删除评论。 我在包管理器控制台中运行了一个更新数据库命令,我一直收到此错误

  

介绍FOREIGN KEY约束'FK_dbo.Comments_dbo.News_NewsId'   在表''评论'可能会导致周期或多个级联路径。   指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他   FOREIGN KEY约束。无法创建约束。见前   错误。   我该如何解决这个问题?

1 个答案:

答案 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);