在Entity Framework中删除多个到多个集合的问题

时间:2018-02-21 20:03:31

标签: c# entity-framework entity-framework-6

我有两个表 - QuestionOptions和Answers。这两者之间存在多对多的关系。我试图删除与特定问题有关的QuestionOptions,并且需要先删除答案。这是我的代码:

using (Survey_Context _context = new Survey_Context())
{
    IQueryable<QuestionOption> questionOptions = _context.QuestionOptions.Where(qo => qo.QuestionID == questionID);
    foreach (QuestionOption questionOption in questionOptions.ToList())
    {
        foreach (Answer answer in questionOption.Answers)
            questionOption.Answers.Remove(answer);
        _context.SaveChanges();
    }
    _context.QuestionOptions.RemoveRange(questionOptions.ToList());
    _context.SaveChanges();
}

这会导致以下情况:

  

错误 - System.InvalidOperationException:修改了集合;   枚举操作可能无法执行。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

您的代码中存在两个主要问题。

首先,导致您看到的无效操作例外的错误:

您正在尝试删除正在迭代的列表元素!

您不应该修改您要枚举的列表(我的意思是:添加或删除元素)(使用foreach,就像在代码中一样)。

这种方式无效。

其次,存在逻辑错误:

如果要删除元素,则要从数据库上下文中删除此对象,而不是从刚创建的某个列表中删除它们。

正如评论中所建议的那样,您可以通过替换:

一次性纠正这两个错误
foreach (Answer answer in questionOption.Answers)
    questionOption.Answers.Remove(answer);

通过

_context.Answers.RemoveRange(questionOption.Answers);