我有两个表 - 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:修改了集合; 枚举操作可能无法执行。
我在这里缺少什么?
答案 0 :(得分:3)
您的代码中存在两个主要问题。
首先,导致您看到的无效操作例外的错误:
您正在尝试删除正在迭代的列表元素!
您不应该修改您要枚举的列表(我的意思是:添加或删除元素)(使用foreach,就像在代码中一样)。
这种方式无效。
其次,存在逻辑错误:
如果要删除元素,则要从数据库上下文中删除此对象,而不是从刚创建的某个列表中删除它们。
正如评论中所建议的那样,您可以通过替换:
一次性纠正这两个错误foreach (Answer answer in questionOption.Answers)
questionOption.Answers.Remove(answer);
通过
_context.Answers.RemoveRange(questionOption.Answers);