.NET 5.0 Web API中AddDbContext注册数据库上下文不生效问题
错误根因
- 调用时机过早:
SetGlobals方法的触发时间早于依赖注入容器的完整构建流程。你在ConfigureServices中编写的AddDbContext配置仅完成了服务注册,并没有完成实例初始化,只有等容器完全构建后,从容器中解析得到的MyDbContext实例才会自动绑定你配置的Sqlite数据库提供器。 - 实例化方式错误:如果
SetGlobals方法内直接通过new MyDbContext()的方式创建上下文实例,没有传入容器构建好的DbContextOptions<MyDbContext>参数,新建的实例就没有绑定任何数据库提供器,触发报错。
修复方案
- 调整
SetGlobals调用时机到容器构建完成后,推荐在Startup.Configure方法中通过参数注入拿到已配置好的MyDbContext实例,再传入SetGlobals使用:
// Startup.cs Configure方法示例 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, MyDbContext dbContext) { // 此处拿到的dbContext已完成提供器配置 SetGlobals(dbContext); // 剩余中间件配置逻辑 }
- 若确实需要在
ConfigureServices执行阶段调用SetGlobals,可临时构建服务提供者获取上下文实例:
// ConfigureServices方法内临时使用,不推荐频繁调用 var tempProvider = services.BuildServiceProvider(); var dbContext = tempProvider.GetRequiredService<MyDbContext>(); SetGlobals(dbContext);
- 全面检查
SetGlobals及其关联逻辑,确保不存在无参数手动创建MyDbContext实例的代码,所有上下文实例均从依赖注入容器获取。
内容的提问来源于stack exchange,提问作者devonuto
相关产品推荐
相关产品推荐

