在 Entity Framework 中使用两个不同的连接字符串进行迁移
Migration with two different connection strings in Entity Framework
我有一个 DbContext
和两个数据库,一个用于调试/开发(本地),一个用于生产(在线)。我用 appsetting.Development.json
和 appsettings.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
条目更改为我的在线数据库并再次执行命令。
所以这是我的问题:
有没有办法选择在迁移命令中应该使用什么配置?
喜欢:
dotnet ef migrations add InitialModel --config Production
有没有一种方法可以将迁移文件与两个数据库一起使用,这样我就不必总是删除迁移文件了?
我不确定是否有迁移命令让您选择配置,因为连接字符串已添加到 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();
这段代码确保您不需要 运行 更新数据库命令。您只需创建迁移并启动您的应用程序。
您只需要在开发完成后,在依赖注入容器中切换连接字符串即可。切换连接字符串时不需要 运行 更新数据库命令。您还可以使用环境变量。你可以看看它,看看它是如何工作的。
我有一个 DbContext
和两个数据库,一个用于调试/开发(本地),一个用于生产(在线)。我用 appsetting.Development.json
和 appsettings.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
条目更改为我的在线数据库并再次执行命令。
所以这是我的问题:
有没有办法选择在迁移命令中应该使用什么配置? 喜欢:
dotnet ef migrations add InitialModel --config Production
有没有一种方法可以将迁移文件与两个数据库一起使用,这样我就不必总是删除迁移文件了?
我不确定是否有迁移命令让您选择配置,因为连接字符串已添加到 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();
这段代码确保您不需要 运行 更新数据库命令。您只需创建迁移并启动您的应用程序。 您只需要在开发完成后,在依赖注入容器中切换连接字符串即可。切换连接字符串时不需要 运行 更新数据库命令。您还可以使用环境变量。你可以看看它,看看它是如何工作的。