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

.NET项目搭配EF Core访问特定页面抛出ObjectDisposedException异常

问题根因

你遇到的偶发ObjectDisposedException核心问题出在缓存逻辑上:
你存入IMemoryCache的是IQueryable类型对象,该类型本身仅保存查询表达式树,不会立刻执行数据库查询,属于EF的延迟执行对象,只有当你调用Count()、First()等触发结果计算的方法时,才会使用构造它时绑定的SurplusMouseContext实例执行实际查询。
首次请求结束后,DI容器会自动释放当前请求作用域内的SurplusMouseContext实例。当后续请求读取到缓存的IQueryable对象并执行计算操作时,绑定的上下文已经被释放,就会抛出对应异常。偶发的原因是仅当缓存未过期、触发缓存命中时才会复现该问题。

解决方案
  • 缓存实际查询结果而非IQueryable对象:构造查询后立刻执行物化操作,把IQueryable转为已加载到内存的结果集再存入缓存,例如调用ToList()、ToArray()、FirstOrDefault()等方法完成查询后再缓存,示例修改逻辑如下:
// 错误写法:缓存未执行的查询表达式
// cache.Set("HolidayWeekData", context.HolidayWeek.Where(x => x.IsValid), TimeSpan.FromHours(2));

// 正确写法:缓存已执行完成的结果集
var holidayData = await context.HolidayWeek.Where(x => x.IsValid).ToListAsync();
cache.Set("HolidayWeekData", holidayData, TimeSpan.FromHours(2));
  • 如果需要对缓存数据做后续动态筛选,可将查询结果转为IEnumerable后再缓存,后续的LINQ操作会直接操作内存集合,不再依赖EF的DbContext实例。
  • 额外排查:确认所有DbContext操作都在请求作用域内完成,如果存在后台任务、异步回调需要使用DbContext,必须通过IServiceScopeFactory手动创建独立作用域获取上下文实例,不要跨请求持有DbContext引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 02:45:08