我将 .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();
}
再次出现同样的错误。有人可以帮忙吗?
我遇到了类似的问题,并按照设计时 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);