使用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
相关产品推荐
相关产品推荐

