Skip to main content
 首页 » 编程设计

c#之在 Entity Framework 中删除多对多集合的问题

2024年02月25日40shihaiming

我有两个表 - 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(); 
} 

这会导致以下情况:

Error - System.InvalidOperationException: Collection was modified; enumeration operation may not execute.

我在这里错过了什么?

请您参考如下方法:

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

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

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

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

这种方式根本无效。

其次,逻辑有误:

如果你想删除元素,那么你想从数据库上下文中删除这个对象,而不是从你刚刚创建的某个列表中删除它们。

正如评论中所建议的那样,您可以通过替换来一次更正这两个错误:

foreach (Answer answer in questionOption.Answers) 
    questionOption.Answers.Remove(answer); 

由

_context.Answers.RemoveRange(questionOption.Answers);