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

使用HotChocolate+EF Core 6遇System.ObjectDisposedException异常求助

解决HotChocolate结合EF Core 6操作Cosmos DB时的System.ObjectDisposedException异常

针对连续创建FooItem时触发的System.ObjectDisposedException,可以从以下几个方向排查解决:

1. 确认DbContext的注入生命周期

确保FooContext是以**范围生命周期(Scoped)**注入到DI容器中。HotChocolate的每个GraphQL请求对应一个独立的Scope,若将DbContext注册为Singleton,会导致上下文被释放后被后续请求复用,触发异常。

  • 正确的注册方式(默认即为Scoped):
    // Program.cs
    builder.Services.AddDbContext<FooContext>(options =>
        options.UseCosmos("your-connection-string", "your-db-name"));
    
  • 不要手动将生命周期改为Singleton或Transient(Transient可能导致其他问题,Scoped是GraphQL场景的最佳选择)。

2. 禁止手动管理DbContext的生命周期

检查DAL层(如FooRepo)的代码,确保没有以下操作:

  • 手动创建DbContext实例并使用using包裹(如using(var ctx = new FooContext()))
  • 主动调用context.Dispose()方法
    DI容器会自动在请求结束时释放Scoped的DbContext,手动处理会导致上下文提前失效。

3. 严格确保所有异步操作都被await

尽管你提到后续方法都使用await,仍需排查以下场景:

  • Resolver或BLL层中是否存在返回未await的Task的情况(如return _fooRepo.CreateAsync(foo);而非return await _fooRepo.CreateAsync(foo);),这会导致请求提前结束,DbContext被提前释放。
  • 检查EF Core重写的异步方法(如SaveChangesAsync)是否正确实现异步逻辑,避免同步阻塞导致上下文生命周期异常。

4. 验证HotChocolate的DbContext关联配置

确保在注册HotChocolate服务时,正确将DbContext与请求Scope关联:

// Program.cs
builder.Services.AddGraphQLServer()
    .AddMutationType<Mutations>()
    // 明确指定DbContext的Scope类型
    .AddDbContext<FooContext>(DbContextKind.Scoped);

避免在Resolver中通过静态变量、全局对象持有DbContext引用,这会导致跨请求复用已释放的实例。

5. Cosmos DB特定配置检查

  • 确认FooContext的Cosmos DB配置正确,避免因连接或容器配置错误导致上下文提前失效:
    // FooContext.cs
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseCosmos(
            "your-cosmos-connection-string",
            "database-name",
            opts => opts.ConnectionMode(ConnectionMode.Direct));
    }
    
  • 检查Cosmos DB操作的异常处理,确保SaveChangesAsync等操作的异常不会导致上下文处于无效释放状态。

排查辅助步骤

  • 启用EF Core日志,跟踪DbContext的创建、使用和释放时机:
    // Program.cs
    builder.Logging.AddFilter("Microsoft.EntityFrameworkCore", LogLevel.Information);
    
  • 在FooContext的构造函数和Dispose方法中添加日志输出,明确实例的生命周期轨迹,确认连续请求时是否存在上下文复用或提前释放的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 19:15:43