我有一个问题。 我有一些看起来像这样的课程:
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中删除记录
答案 0 :(得分:1)
这与我今天回答的另一个问题(Deleting only one entry from Many-to-Many relationship)非常相似。只是你的情况有点复杂。
您的案例中的多个级联路径是Criteria
到AnswerStates
。删除Criteria
记录时,可以AnswerStates
或Criteria->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));