You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DbSet.Local引发集合修改异常的原因探究

异常底层原因解析

核心触发逻辑

System.InvalidOperationException: Collection was modified; enumeration operation may not execute 异常的本质是:正在枚举的集合在遍历过程中被修改,.NET枚举器不允许这种行为。结合你的EF Core场景,具体触发路径如下:


对应两种修复方案的底层原因

  • 方案1:将DbSet.Local转为List
    DbSet.Local是EF Core上下文维护的动态ObservableCollection,它会实时同步上下文跟踪的所有实体(新增、删除、加载的实体都会实时反映到这个集合里)。当你直接枚举DbSet.Local时,如果在枚举过程中(比如GetSingleByCache执行期间、或外部关联操作触发的懒加载)上下文向Local集合中添加/移除了实体,就会打破枚举器的遍历状态,触发异常。
    转为List后,相当于创建了DbSet.Local的静态快照副本,你枚举的是这个固定的副本,原Local集合的动态变化不会影响枚举过程,因此不会触发异常。

  • 方案2:避免直接关联查询Classification.Name
    你使用了EntityFrameworkCore.Proxies包,EF Core会为实体生成懒加载代理。当你直接访问关联实体的属性(比如Slave.Classification.Name)时,懒加载会自动从数据库加载对应的Classification实体,并将这个实体自动添加到上下文的DbSet<Classification>.Local集合中。
    此时如果GetSingleByCache方法正在枚举某个DbSet.Local集合(比如TMClass的Local),这个新增实体的操作会修改集合结构,导致枚举器抛出异常。而先查询Classification的Id再关联,不会触发懒加载,也就不会有实体被添加到Local集合,避免了集合修改的问题。


内容的提问来源于stack exchange,提问作者tschmit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:35:03