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

.NET7中AddDbContextPool结合Azure KeyVault配置DbContext报错排查

问题描述
  • 使用services.AddDbContextPool<ApplicationDbContext>配置上下文并启用连接池,调用SignInManager.PasswordSignInAsync时触发错误:

'No database provider has been configured for this DbContext' on SignInManager.PasswordSignInAsync

  • 尝试重写DbContext的OnConfiguring方法直接读取本地配置,本地运行正常,但部署到Azure App Service时,因该方式无法解析App Service中配置的KeyVault引用(格式为@Microsoft.KeyVault(SecretUri=...)),触发错误:

Keyword not supported: @microsoft.keyvault

  • 需求:保留连接池的前提下,让DbContext使用包含KeyVault解析后值的全局IConfiguration,而非手动构建的配置实例。
解决方案

方案1:确保ApplicationDbContext构造函数正确接收DbContextOptions

多数情况下错误源于DbContext未正确依赖注入DbContextOptions,需确保上下文包含对应构造函数:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }

    // 禁止添加无参构造函数,避免干扰依赖注入流程
}

随后在Program.cs中确保配置连贯,且Identity相关服务复用同一上下文:

// 配置DbContext连接池,直接使用全局IConfiguration读取已解析的连接字符串
services.AddDbContextPool<ApplicationDbContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

// 配置Identity服务,指定使用ApplicationDbContext
services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

// 配置Duende IdentityServer(按需调整)
services.AddIdentityServer()
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

说明:此方案遵循依赖注入原则,DbContextOptions已包含全局IConfiguration(含Azure KeyVault解析后的值)读取的连接字符串,无需重写OnConfiguring。

方案2:通过构造函数注入全局IConfiguration(需保留OnConfiguring时使用)

若因特殊需求必须保留OnConfiguring,可通过构造函数注入全局IConfiguration替代手动构建:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    private readonly IConfiguration _configuration;

    // 注入全局IConfiguration
    public ApplicationDbContext(IConfiguration configuration)
    {
        _configuration = configuration;
    }

    // 保留接收DbContextOptions的构造函数,兼容依赖注入流程
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, IConfiguration configuration)
        : base(options)
    {
        _configuration = configuration;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            var connectionString = _configuration.GetConnectionString("DefaultConnection");
            optionsBuilder.UseSqlServer(connectionString);
        }
    }
}

同时确认Program.cs中已配置KeyVault源(需安装Azure.Extensions.AspNetCore.Configuration.Secrets包):

var builder = WebApplication.CreateBuilder(args);

// 添加Azure KeyVault配置源
builder.Configuration.AddAzureKeyVault(
    new Uri("https://mykeyvault.vault.azure.net/"),
    new DefaultAzureCredential());

// 后续配置DbContextPool和Identity服务...

说明:全局IConfiguration包含App Service及KeyVault的所有解析后配置值,解决手动构建配置无法读取KeyVault引用的问题。

方案3:检查Azure App Service配置类型

确保Azure App Service中配置的DefaultConnection类型为SQL Server:

  1. 登录Azure门户,进入目标App Service
  2. 左侧菜单选择「配置」→「应用程序设置」
  3. 找到DefaultConnection,将「类型」设置为「SQL Server」
  4. 保存配置并重启App Service
关键注意事项
  • 禁止在OnConfiguring中手动构建IConfiguration,否则会绕过.NET Core全局配置系统,无法读取Azure注入的KeyVault值。
  • 确保IdentityServer与Identity服务使用同一ApplicationDbContext实例,避免上下文配置不一致。
  • 确认已安装必要NuGet包:Microsoft.EntityFrameworkCore.SqlServer、Azure.Extensions.AspNetCore.Configuration.Secrets、Duende.IdentityServer.AspNetIdentity等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:32:23