默认架构不存在EF Core迁移

问题描述 投票:0回答:1

我将 .Net Core 6 与 EF Core(Code First)和 Azure SQL 结合使用。当我运行

add-migration
命令时,它会生成文件,当我运行
update-database
命令时,我收到以下错误。

当我有到本地数据库的连接字符串时,

update-database
命令也可以工作。仅当连接字符串更改为 Azure SQL 并且该连接字符串是从 Azure KeyVault 获取时,才会出现此问题。

试过了,

在 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();
}

再次出现同样的错误。有人可以帮忙吗?

c# .net-core entity-framework-core azure-sql-database
1个回答
0
投票

我遇到了类似的问题,并按照设计时 DbContext 创建(MS 学习)中的建议在设计时和运行时之间使用不同的方法解决了。

为了在设计时工作,我定义了一个从

IDesignTimeDbContextFactory
派生的类。 当您执行迁移时,
update-database
dotnet
CLI 自动检测到此类。

public class MyDbContextFactory : IDesignTimeDbContextFactory<MyDbContext> {
    public MyDbContext CreateDbContext(string[] args) {
        var optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
        optionsBuilder.UseSqlServer("... connection string here ..."
            , options => {
                options.MigrationsHistoryTable("EFMigrationHistory", "dbo");
            });

        return new MyDbContext(optionsBuilder.Options, null); 
    }
}

在运行时工作,例如如果要在启动时进行数据库更新,则不使用前面的类。要在运行时设置迁移历史记录表,我使用

sqlServerOptionsAction
方法中的 sql
UseSqlServer
参数设置迁移历史记录:

builder.Services.AddDbContext<MyDbContext>(options => {
    options.UseSqlServer(builder.Configuration.GetConnectionString("dbConnection"),
        sqlServerOptionsAction: sqlOptions => {
            sqlOptions.MigrationsHistoryTable("EFMigrationHistory", "dbo");
            sqlOptions.MigrationsAssembly(typeof(MyDbContext).Assembly.GetName().Name);
            sqlOptions.EnableRetryOnFailure(maxRetryCount: 15, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
        });
}, ServiceLifetime.Scoped);
© www.soinside.com 2019 - 2024. All rights reserved.