【问题标题】:Collection was modified after the enumerator was instantiated when attaching an entity to database context在将实体附加到数据库上下文时实例化枚举器后修改了集合
【发布时间】:2020-02-17 05:30:42
【问题描述】:

要将实体附加到实体框架中的数据库上下文,我使用以下内容:

var student = GetStudent();
if (!_dbContext.Students.Local.Any(e => e.ID == student.ID))
    _dbContext.Attach(student);

此代码有时(例如,3 个中有 1 个)失败,并在调用 Attach 时引发以下错误:

System.InvalidOperationException:枚举数实例化后修改了集合。

只要在抛出异常时重新运行这段代码,就可以解决问题。但是,我想知道为什么会看到此错误、导致它的原因以及如何解决它?

(此代码属于一个大项目,我不确定哪些部分可以帮助确定此问题的原因;如果您有任何疑问,请告诉我,并将分享相关代码。)

【问题讨论】:

  • 这段代码是否嵌套在 foreach 循环中?
  • 不,不是。它位于由 API 控制器调用的方法中。

标签: c# asp.net-core entity-framework-core


【解决方案1】:

如果您重新运行该项目并且它按预期工作,我认为这可能与缓存有关。能否请您添加这样的 AsNoTracking() 方法。

var student = GetStudent();
if (!_dbContext.Students.AsNoTracking().Local.Any(e => e.ID == student.ID))
    _dbContext.Attach(student);

【讨论】:

  • 上面写着IQuerable<Students> does not contain a definition for Local
  • 能否提供学生和本地模型
  • Local 不是我的模型;它的built-in
【解决方案2】:

我不能给你确切的答案,但例外解释了正在发生的事情。简单来说,当您尝试附加时,您的收藏会被其他线程更改。

这通常发生在您使用并行编程时。通过调试,您必须确定代码下面发生的事情并尝试解决它。​​

【讨论】:

    猜你喜欢
    • 2012-02-06
    • 2022-01-21
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2016-02-24
    • 2012-04-30
    相关资源
    最近更新 更多