Entity Framework Core 2.0中的迁移 - 如何指定环境或传递参数

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

似乎也没有用.

Ph0*_*n1x 1

好吧,说实话我不知道这个问题的确切答案。我认为环境变量应该有效,但是设置它们的方式很大程度上取决于您工作的环境。因此,这将是 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)

这当然不是一个完美的解决方案,但如果您没有选择 - 这可能是一个解决方法。您也可以通过这种方式传递其他参数。

  • 设置环境变量不起作用。尽管 ASPNETCORE_Environment 设置为 Production,但仍以开发实例为目标 (3认同)