Entity Framework Core 2.0中的遷移 - 如何指定環境或傳遞參數

asp.net-core c# entity-framework entity-framework-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>();
    }

它類似於: dotnet ef database drop -e development版本1.1 ,但這已從2.0版本中刪除。

set ASPNETCORE_ENVIRONMENT=development dotnet ef database drop

似乎也行不通。

熱門答案

我從這裡收集的是-e MyCustomEnvironment在Core 2.x的EF核心設計工具中不可用


要設置環境變量,我發現根據您的用例,您有以下選擇

此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這將在每次執行cd ~ echo 'export ASPNETCORE_ENVIRONMENT=<Environment Name>' >> .bashrc時實際導出變量。我不確定這是否適合Linux,但它對我有用。


同樣在我的情況下,我不想運行StartUp代碼,因為我覺得對於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>();


此外,如果您有更複雜的szenarios,您現在可能想要創建一些小批量或shell skripts



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow