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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 08:09:42