我使用的是.Net Core6和EF Core(代码优先)和Azure SQL.当我运行add-migration命令时,它会生成文件,而当我运行update-database命令时,我会得到以下错误.

enter image description here

此外,当我有到本地数据库的连接字符串时,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();
}

同样的错误再次出现.有人能帮帮忙吗?

推荐答案

我遇到了类似的问题,并使用设计时和运行时之间的不同方法解决了问题,正如Design-time DbContext Creation (MS learn)中所建议的那样.

为了在设计时工作,我定义了一个派生自IDesignTimeDbContextFactory的类. 当您执行迁移时,update-databasedotnet 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); 
    }
}

要在运行时工作,例如,如果要在启动时执行数据库更新,则不使用上一个类.为了在运行时设置迁移历史表,我在UseSqlServer方法中使用SQL sqlServerOptionsAction参数设置迁移历史:

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);

Csharp相关问答推荐

在C# 11之前, struct 中的每个字段都必须显式分配?不能繁殖

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

为什么C#Bigbit不总是相同的比特长度?

安装附加的. exe与Visual Studio

Take()方法如何与IAsyncEnumerable一起使用

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

.NET SDK包中的官方C#编译器在哪里?

Automapper 12.x将GUID映射到字符串

VS 2022 for ASP.NET Core中缺少自定义项模板

我可以查看我们向应用程序洞察发送了多少数据吗?

错误CS1061';AuthenticationBuilder';不包含AddOpenIdConnect的定义

C# Winforms:从对象树到TreeView的递归转换重复条目

用于请求用户返回列表的C#Google API

为什么当我try 为玩家角色设置动画时,没有从文件夹中拉出正确的图像?

如何使用LINQ在C#中填充列表列表?

在C#中通过Matheval使用自定义公式

获取应用程序版本信息时出现奇怪信息

C#-如何将int引用获取到byte[]

如何对构建在Clean架构和CQRS之上的控制器进行单元测试?

ASP.NET核心中的验证错误-该字段为必填字段