sil*_*der 8 c# entity-framework entity-framework-core asp.net-core
我正在使用EF Core 2.0并且在我的应用程序中有3个环境:dev,staging和prod.现在我想将db模式应用于特定数据库.但是我遇到了一个问题.dotnet ef database drop (update)
例如,当我执行时,它会尝试默认生成env.
我怎样才能指定应该使用哪种环境?我的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>();
}
Run Code Online (Sandbox Code Playgroud)
它类似于:
dotnet ef database drop -e development
在版本中1.1
,但这已从版本中删除2.0
.
set ASPNETCORE_ENVIRONMENT=development
dotnet ef database drop
似乎也没有用.
好吧,说实话我不知道这个问题的确切答案。我认为环境变量应该有效,但是设置它们的方式很大程度上取决于您工作的环境。因此,这将是 Linux 上的一个故事,Windows 上的不同(PowerShell 也不同)以及 MacOS 上的其他故事。
这对我Linux
和 bash 控制台都有效Windows
:
ASPNETCORE_ENVIRONMENT="{NAME_OF_ENV}";dotnet ef {somecommand you want to execute}
Run Code Online (Sandbox Code Playgroud)
你Powershell
可以尝试这样的事情:
$env:ASPNETCORE_ENVIRONMENT="{NAME_OF_ENV}"
dotnet ef {somecommand you want to execute}
Run Code Online (Sandbox Code Playgroud)
然而,即使它是迁移,它内部仍然是一个控制台应用程序。因此,您可以要求用户从控制台进入环境,如下所示:
Console.WriteLine("Enter environment you want to use");
var env = Console.ReadLine();
WebHost.CreateDefaultBuilder(args)
.UseEnvironment(env)
.UseStartup<Startup>()
.Build().Services.GetRequiredService<MyDbContext>();
Run Code Online (Sandbox Code Playgroud)
这当然不是一个完美的解决方案,但如果您没有选择 - 这可能是一个解决方法。您也可以通过这种方式传递其他参数。