![](/img/trans.png)
[英]Entity Framework Core how to execute migrations in production environment
[英]Migrations in Entity Framework Core 2.0 - How to specify environment or pass arguments
我正在使用EF Core 2.0,并且在我的应用程序中包含3个环境:dev,staging和prod。 现在,我想将数据库架构应用于特定的数据库。 但是我面临一个问题。 例如,当我执行dotnet ef database drop (update)
,它默认尝试获取生产环境。
如何指定应使用的环境? 我的DbContextFactory看起来像这样:
public class MyDbContextFactory : IDbContextFactory<MyDbContext>
{
public MyDbContext Create(string[] args) => //how to pass something to this args?
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build().Services.GetRequiredService<MyDbContext>();
}
它类似于: 1.1
版中的dotnet ef database drop -e development
,但已从2.0
版中删除。
set ASPNETCORE_ENVIRONMENT=development dotnet ef database drop
似乎也不起作用。
我从这里收集到的是-e MyCustomEnvironment
在适用于Core 2.x的EF Core Design Tools中不可用
要设置环境变量,我发现您根据用例有以下选择
set ASPNETCORE_ENVIRONMENT <Environment Name>
setx ASPNETCORE_ENVIRONMENT <Environment Name>
“开始”->“编辑系统环境变量”->“环境变量”->“新建”
export ASPNETCORE_ENVIRONMENT=<Environment Name>
cd ~ echo 'export ASPNETCORE_ENVIRONMENT=<Environment Name>' >> .bashrc
这实际上将在每次执行.bashrc时导出变量。 我不确定这是否可以在Linux上运行,但是对我有用。
同样,在我的情况下,我不想运行启动代码,因为我感觉对于DesignTime操作而言,不需要注册我的应用程序的所有服务等。 可以这样完成:
var basePath = AppDomain.CurrentDomain.BaseDirectory;
var envName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var builder = new ConfigurationBuilder()
.SetBasePath(basePath)
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{envName}.json", true)
.AddEnvironmentVariables();
var config = builder.Build();
var customOptions = config.GetSection("database").Get<DatabaseOptions>();
另外,如果您有更复杂的szenario,您现在可能要创建一些小批量或shell skripts
好吧,老实说,我不知道这个问题的确切答案。 我认为环境变量应该起作用,但是设置它们的方式很大程度上取决于您所工作的环境。 因此,这将是在Linux上的一个故事,在Windows上将有所不同(在PowerShell中又有所不同),在MacOS上也会有所不同。
这在Linux
和Windows
bash控制台中对我有效:
ASPNETCORE_ENVIRONMENT="{NAME_OF_ENV}";dotnet ef {somecommand you want to execute}
在Powershell
您可以尝试如下操作:
$env:ASPNETCORE_ENVIRONMENT="{NAME_OF_ENV}"
dotnet ef {somecommand you want to execute}
但是,即使是迁移,它仍然是内部的控制台应用程序。 因此,您可以要求用户从控制台通过以下方式进入环境:
Console.WriteLine("Enter environment you want to use");
var env = Console.ReadLine();
WebHost.CreateDefaultBuilder(args)
.UseEnvironment(env)
.UseStartup<Startup>()
.Build().Services.GetRequiredService<MyDbContext>();
这当然不是一个完美的解决方案,但是如果您没有其他选择,这可能是一种解决方法。 您也可以通过这种方式传递其他参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.