【问题标题】:Migration with two different connection strings in Entity Framework在实体框架中使用两个不同的连接字符串进行迁移
【发布时间】:2020-12-04 19:03:31
【问题描述】:

我有一个 DbContext 和两个数据库,一个用于调试/开发(本地),一个用于生产(在线)。我用appsetting.Development.jsonappsettings.Production.json 文件切换它们。

两者都看起来像这样:

{
  "ConnectionStrings": {
    "Default": "Server={myServer};Persist Security Info=False;User ID={MyUser};Password={myPassword};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
  }

因此,当我编写代码并启动它时,它使用 localDb,而当我发布它时,它使用另一个数据库。

现在,当我更改模型中的某些内容时,我总是要删除迁移文件,然后这样做

dotnet ef migrations add InitialModel

然后

dotnet ef database update

之后再次删除迁移文件,将appsettings.Development.json 条目更改为我的在线数据库并再次执行命令。

所以这是我的问题:

  1. 有没有办法选择迁移命令中应该使用的配置? 喜欢:

     dotnet ef migrations add InitialModel --config Production
    
  2. 有没有办法将迁移文件与两个数据库一起使用,这样我就不必总是删除迁移文件?

【问题讨论】:

    标签: asp.net-core entity-framework-core asp.net-core-webapi entity-framework-core-migrations


    【解决方案1】:

    我不确定是否有一个迁移命令可以让您选择配置,因为连接字符串已添加到 Startup.cs 文件中。但是,我可以分享我是如何做到的,你看看它是否适合你。通常,我会在 appsettings.json 文件中有两个连接字符串。像这样的东西 "ConnectionStrings": {"DevConnection": "Data source=databasename.db","ProdConnection":"Data source=databasename.db"},Startup.cs 文件中,我在依赖注入容器中指定了连接字符串。在我的Program.cs 文件中,我有这个

            var host = CreateHostBuilder(args).Build();
            using(var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;
                try
                {
                    var context = services.GetRequiredService<DataContext>();
                    var userManager = services.GetRequiredService<UserManager<AppUser>>(); //if you have users in your seed data
                    context.Database.Migrate();
                    Seed.SeedData(context, userManager).Wait(); //If you have seed data with test users
    
                }
                catch(Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred during migration");
                }
            }
            host.Run();
    

    这段代码确保您不需要运行更新数据库命令。您只需创建迁移并启动应用程序。 你只需要在开发之后,在依赖注入容器中切换连接字符串。切换连接字符串时无需运行更新数据库命令。您还可以使用环境变量。你可以看看它,看看它是如何工作的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多