.Net Azure Functions如何注入两个DbContext并解决查询返回空问题
问题根因
两个数据库上下文查询返回0条数据的核心原因是派生DbContext构造函数的泛型参数类型不匹配:
EF Core 依赖注入系统会为每个注册的DbContext生成对应类型的DbContextOptions<TContext>实例,你当前在FirstDbContext、SecondDbContext的构造函数中声明接收的是DbContextOptions<MyDbContext>,和DI容器中实际注册的DbContextOptions<FirstDbContext>、DbContextOptions<SecondDbContext>类型不匹配,导致上下文实例没有正确加载你配置的连接字符串和数据库选项,查询无法命中正确的数据库。
修复步骤
- 给基类
MyDbContext新增受保护的非泛型构造函数重载,兼容派生上下文传参 - 修改两个派生DbContext的构造函数,声明接收和自身类型匹配的
DbContextOptions<派生类名>参数,传递给基类构造函数 - 确认Startup中读取的连接字符串配置正确,原有
AddDbContext注册逻辑本身不需要调整
修复后完整代码
MyDbContext.cs
namespace AzFunc.Library.MyDbContext { public partial class MyDbContext: DbContext { // 保留原有构造函数,兼容单上下文场景使用 public MyDbContext(DbContextOptions<MyDbContext> options) : base(options) { this.ChangeTracker.LazyLoadingEnabled = false; } // 新增给派生上下文使用的受保护构造函数 protected MyDbContext(DbContextOptions options) : base(options) { this.ChangeTracker.LazyLoadingEnabled = false; } public virtual DbSet<User> Users{ get; set; } } }
CustomContexts.cs
using Microsoft.EntityFrameworkCore; using StivaRiesgos.Library.MyDbContext; public class FirstDbContext: MyDbContext { // 构造函数接收匹配自身类型的Options public FirstDbContext(DbContextOptions<FirstDbContext> options) : base(options) { } } public class SecondDbContext: MyDbContext { // 构造函数接收匹配自身类型的Options public SecondDbContext(DbContextOptions<SecondDbContext> options) : base(options) { } }
Startup.cs
public class StartUp : FunctionsStartup { public override void Configure(IFunctionsHostBuilder builder) { // 原有注册逻辑保留,注意确认连接字符串读取正确(推荐从环境变量/配置中读取,不要硬编码) builder.Services.AddDbContext<FirstDbContext>(options => options.UseSqlServer(Environment.GetEnvironmentVariable("ConnectionStringDbOne"))); builder.Services.AddDbContext<SecondDbContext>(options => options.UseSqlServer(Environment.GetEnvironmentVariable("ConnectionStringDbTwo"))); } }
验证说明
修改完成后,DI容器会为FirstDbContext和SecondDbContext分别注入绑定了对应连接字符串的Options实例,两个上下文查询时会连接到各自对应的SQL Server数据库,返回正确的查询结果。
如果需要在同一个函数中同时使用两个上下文,现有函数的构造函数注入逻辑不需要调整,可以直接使用。
内容的提问来源于stack exchange,提问作者Agent Smith
相关产品推荐
相关产品推荐

