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
相关产品推荐
相关产品推荐

