繁体   English   中英

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

[英]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中不可用


要设置环境变量,我发现您根据用例有以下选择

此CMD会话的环境变量(Windows):

set ASPNETCORE_ENVIRONMENT <Environment Name>

用户环境(Windows)中的环境变量:

setx ASPNETCORE_ENVIRONMENT <Environment Name>

也可以通过GUI(Windows)

“开始”->“编辑系统环境变量”->“环境变量”->“新建”

此Shell会话的环境变量(Linux):

export ASPNETCORE_ENVIRONMENT=<Environment Name>

用户环境(Linux)中的环境变量:

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上也会有所不同。

这在LinuxWindows 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM