EF多对多级联删除

时间:2016-04-12 10:58:26

标签: entity-framework

我有一个问题。 我有一些看起来像这样的课程:

public class Question
{
    public int Id { get; set; }
    [Required] [MaxLength(255)] public string Text { get; set; }
    public int CriteriaId { get; set; }
    public int QuestionGroupId { get; set; }

    public QuestionGroup QuestionGroup { get; set; }
    public virtual IList<Answer> Answers { get; set; }
    public virtual Criteria Criteria { get; set; }
}

public class Answer
{
    public int Id { get; set; }
    [Required] [MaxLength(255)] public string Text { get; set; }
    public int QuestionId { get; set; }

    public Question Question { get; set; }
    public virtual IList<State> States { get; set; }
}

public class Criteria
{
    public int Id { get; set; }
    [Required] [MaxLength(100)] public string Name { get; set; }

    public virtual IList<State> States { get; set; }
    public IList<Question> Questions { get; set; }
}

public class State
{
    public int Id { get; set; }
    public int CriteriaId { get; set; }
    [Required] [MaxLength(100)] public string Name { get; set; }
    public int Score { get; set; }

    public virtual IList<Filter> Filters { get; set; }
    public Criteria Criteria { get; set; }
}

他们有很多关系,所以我创建了这个映射:

modelBuilder.Entity<Answer>()
    .HasMany(m => m.States)
    .WithMany()
    .Map(m => {
        m.MapLeftKey("AnswerId");
        m.MapRightKey("StateId");
        m.ToTable("AnswerStates");
    });

当我尝试更新我的数据库时,我收到有关外键的错误。 所以我添加了这一行(作为临时修复):

modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

但我需要级联删除。 我似乎无法弄清楚为什么它不会让我拥有它。 尝试包含级联删除时出现的错误是:

  
    

介绍FOREIGN KEY约束&#39; FK_dbo.AnswerStates_dbo.States_StateId&#39;在桌子上#答案状态&#39;可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

  

我希望我提供了足够的信息。有谁知道我可以做什么来允许级联删除(我需要能够删除状态答案并从 AnswerStates中删除记录

1 个答案:

答案 0 :(得分:1)

这与我今天回答的另一个问题(Deleting only one entry from Many-to-Many relationship)非常相似。只是你的情况有点复杂。

您的案例中的多个级联路径是CriteriaAnswerStates。删除Criteria记录时,可以AnswerStatesCriteria->States->AnswerStates关系删除Criteria->Questions->Answers->AnswerStates条记录。

解决方案始终是同一个 - 关闭其中一个关系cascade delete并手动或通过触发器处理删除。

在这种特殊情况下,我的建议是关闭Criteria->States级联删除:

modelBuilder.Entity<Criteria>()
    .HasMany(m => m.States)
    .WithRequired(d => d.Criteria)
    .HasForeignKey(d => d.CriteriaId)
    .WillCascadeOnDelete(false);

并在删除Criteria之前使用类似的内容:

db.States.RemoveRange(db.States.Where(s => s.CriteriaId == criteriaId_to_be_removed));