C# 实体框架中删除时的级联说明

C# 实体框架中删除时的级联说明,c#,sql,asp.net,asp.net-mvc,entity-framework,C#,Sql,Asp.net,Asp.net Mvc,Entity Framework,我需要一个彻底的解释级联删除,因为它是给我不必要的头痛。我有一个class News.cs和一个class Comment.cs。新闻有一组评论,评论必须属于新闻,所以我像下面这样设置我的类 public class News { public int NewsId { get; set; } [Display(Name = "Title")] public string Title { get; set; } [Display(Name = "Details

我需要一个彻底的解释级联删除,因为它是给我不必要的头痛。我有一个class News.cs和一个class 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; }

}
公共类新闻
{
public int NewsId{get;set;}
[显示(Name=“Title”)]
公共字符串标题{get;set;}
[显示(Name=“详细信息”)]
公共字符串详细信息{get;set;}
public DateTime DateCreated{get;set;}
public int AppUserId{get;set;}
[ForeignKey(“AppUserId”)]
公共虚拟AppUser AppUser{get;set;}
公共ICollection注释{get;set;}
}
公开课评论
{
public int CommentId{get;set;}
公共字符串注释文本{get;set;}
public DateTime DateCreated{get;set;}
public int AppUserId{get;set;}
public int NewsId{get;set;}
[ForeignKey(“AppUserId”)]
公共虚拟AppUser用户{get;set;}
[外国密钥(“新闻ID”)]
公共虚拟新闻{get;set;}
}
我期望的行为是,如果我删除一条评论,它不应该影响父新闻,但如果我删除一条新闻,我看不出有任何理由保留子评论,因此应该删除评论。 我在PackageManager控制台中运行了一个更新数据库命令,并且一直收到这个错误

引入外键约束“FK_dbo.Comments_dbo.News_NewsId” 表上的“注释”可能导致循环或多个级联路径。 指定在删除时不执行操作或在更新时不执行操作,或修改其他 外键约束。无法创建约束。见前文 错误。 我如何解决这个问题


此错误是由于删除一个实体时,另一个实体将被删除多次

在您的场景中,如果在启用cascade delete的情况下删除AppUser,将尝试删除从属实体、新闻和评论。由于评论也依赖于新闻,当新闻被删除时,评论将作为依赖项(再次)被删除。由于对AppUser的依赖关系,该实体可能已被删除,SQL无法保证该实体现在存在,因此SQL Server将首先阻止您实现该实体

要解决此问题,最简单的方法是通过fluent 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);
modelBuilder.Entity().HasMany(au=>au.Comments)
.WithRequired(c=>c.AppUser)
.HasForeignKey(c=>c.AppUserID)
.WillCascadeOnDelete(假);
modelBuilder.Entity().HasMany(au=>au.News)
.WithRequired(n=>n.AppUser)
.HasForeignKey(n=>n.AppUserID)
.WillCascadeOnDelete(假);

因为新闻链接到评论,而评论链接到新闻,所以删除时会出现“循环”。您需要在注释上指定ON DELETE NO ACTION选项。因此,当您删除新闻时,评论会被删除,但不会对返回新闻的链接执行任何操作(阻止循环)。您可以使用Fluent API删除级联删除,如下所述:@JustFogMaxi no,双向关系只是一个类模型工件。在数据库中,它是一个相同的外键,定义了一个级联删除操作(从父级到子级)。这一定是由具有级联删除的其他外键引起的,我怀疑
Comment.AppUser
@GertArnold我应该用其他实体更新问题,还是应该怎么做?我尝试了这个,并且我能够运行更新数据库,但是在访问应用程序时,我尝试删除一个新闻项,结果出现了这个错误。delete语句与引用约束“FK_dbo.Comments_dbo.news_NewsId”冲突. 冲突发生在数据库“Intranet”、表“dbo.Comments”、列“NewsId”中。该语句已终止。因此,请使该FK级联,而不是另一个。