代码之家  ›  专栏  ›  技术社区  ›  Dr. Strangelove

将实体附加到数据库上下文时,在枚举器实例化后修改了集合

  •  0
  • Dr. Strangelove  · 技术社区  · 5 年前

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

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

    此代码 有时 (例如,三分之一)失败,出现以下错误 Attach 被称为:

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

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

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

    0 回复  |  直到 5 年前
        1
  •  0
  •   So_oP    5 年前

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

    var student = GetStudent();
    if (!_dbContext.Students.AsNoTracking().Local.Any(e => e.ID == student.ID))
        _dbContext.Attach(student);
    
        2
  •  0
  •   cdev    5 年前

    我不能给你确切的答案,但特例解释了发生的事情。简单地说,当您尝试附加时,您的集合将被其他线程更改。

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

    推荐文章