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

EF Core迁移Azure SQL时提示默认架构不存在问题求助

.NET Core 6 + EF Core Code First 连接Azure SQL时执行update-database报「默认架构不存在」错误

问题描述

使用.NET Core 6搭配EF Core(Code First模式)和Azure SQL,执行add-migration可正常生成迁移文件,但执行update-database时出现「默认架构不存在」错误。本地数据库连接时update-database运行正常,仅切换为从Azure KeyVault获取的Azure SQL连接字符串时才触发该问题。

已尝试的方案:

  • 在DbContext中配置迁移历史表:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    var relationalOptions = RelationalOptionsExtension.Extract(optionsBuilder.Options);
    relationalOptions.WithMigrationsHistoryTableName("EFMigrationHistory");
    relationalOptions.WithMigrationsHistoryTableSchema("dbo");
}
  • 在Program.cs中添加自动迁移代码:
using (var scope = app.Services.CreateScope())
{
    var db = scope.ServiceProvider.GetRequiredService<NotificationDbContext>();
    db.Database.Migrate();
}

问题仍未解决,求可行的解决方法。


解决方法

1. 检查并配置Azure SQL用户的默认架构

Azure SQL的数据库用户可能未将dbo设为默认架构,或缺少对应权限。登录Azure SQL数据库执行以下SQL:

-- 查看用户默认架构
SELECT name, default_schema_name FROM sys.database_principals WHERE type = 'S';

-- 设置用户默认架构为dbo
ALTER USER [你的数据库用户名] WITH DEFAULT_SCHEMA = dbo;

-- 授予dbo架构控制权限
GRANT CONTROL ON SCHEMA::dbo TO [你的数据库用户名];

2. 全局设置模型默认架构

在DbContext的OnModelCreating方法中,为所有实体指定默认架构:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 全局设置默认架构为dbo
    modelBuilder.HasDefaultSchema("dbo");

    // 其他模型配置代码...
}

3. 修正迁移历史表的配置方式

之前的OnConfiguring配置方式有误,需通过optionsBuilder直接配置。若使用依赖注入配置DbContext,应在Program.cs中指定:

builder.Services.AddDbContext<NotificationDbContext>(options =>
    options.UseSqlServer(
        builder.Configuration.GetConnectionString("YourAzureSqlConn"),
        sqlOpts => sqlOpts.MigrationsHistoryTable("EFMigrationHistory", "dbo")
    )
);

若保留OnConfiguring配置,需修改为:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    base.OnConfiguring(optionsBuilder);
    optionsBuilder.UseSqlServer(
        "你的Azure SQL连接字符串",
        sqlOptions => sqlOptions.MigrationsHistoryTable("EFMigrationHistory", "dbo")
    );
}

4. 验证Azure KeyVault连接字符串的正确性

临时将从KeyVault获取的连接字符串输出到日志(注意脱敏),对比本地正常连接字符串的格式,确认Initial Catalog、用户信息等参数无误,无额外干扰参数。

5. 手动创建dbo架构(若不存在)

如果Azure SQL数据库中确实没有dbo架构,执行以下SQL手动创建:

CREATE SCHEMA dbo;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:52:33