asp.net-core - 在 Entity Framework 中使用两个不同的连接字符串进行迁移

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

我有一个 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. 有没有办法将迁移文件与两个数据库一起使用,这样我就不必总是删除迁移文件?

最佳答案

我不确定是否有一个迁移命令可以让您选择配置,因为连接字符串已添加到 Startup.cs 文件中。不过,我可以分享我是如何做的,你看看它是否适合你。通常,我会在 appsettings.json 文件中有两个连接字符串。像这样的东西 "ConnectionStrings": {"DevConnection": "数据源=databasename.db","ProdConnection":"数据源=databasename.db"},Startup.cs 文件中,我指定了依赖项注入(inject)容器中的连接字符串。在我的 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();

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

关于asp.net-core - 在 Entity Framework 中使用两个不同的连接字符串进行迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63420432/

相关文章:

c# - 在 ASP.Net Core 中为每个请求创建一次 EF Core 上下文

asp.net-core-mvc - 如何在两个.Net core MVC和Web API项目中使用一个数据库?

c# - 一个 Web API Controller 来控制所有模型

c# - 在 ASP.NET Core 和 EF Core 中使用 MySQL 提供程序时出现 NotImplemented 异常

c# - 自定义授权属性 - ASP .NET Core 2.2

c# - EF Core 多个 HTTP 请求抛出错误

asp.net-core - EF Core 5 TPT 和身份 (CRUD)

asp.net-core - .NET Core API - 通过 Postman 将对象数组作为 FormData 发送

asp.net-core - 无法解析类型 'Microsoft.EntityFrameworkCore.DbContextOptionsBuilder` 的服务

asp.net-core - 为什么我不应该使用 IFormFile 进行大型上传