1

我想在ASP.NET Core 2.0和EntityFramework Core 2.0的應用程序啓動時自動運行數據庫遷移。在應用程序啓動時使用Entity Framework ASP.NET Core運行數據庫遷移

我找到了Run database migrations using Entity Framework core on application start。但是,我的連接字符串存儲在環境變量中,因此只有在Configure方法中調用.AddEnvironmentVariables()後才能找到它們。

如何調用the db.Database.Migrate()或如何通過連續部署和分段環境正確執行數據庫遷移(在Azure Web App中)?

public class Startup 
{ 
    private IConfigurationRoot Configuration { get; set; } 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 

     services.AddDbContext<ClientContext>(options => options.UseSqlServer(this.Configuration.GetConnectionString("AppService"))); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
    { 
     app.UseMvc(); 

     this.Configuration = new ConfigurationBuilder() 
      .SetBasePath(env.ContentRootPath) 
      .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
      .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
      .AddEnvironmentVariables() 
      .Build(); 
    } 

    // public void Configure(IApplicationBuilder app, ClientContext db) 
    // { 
    //  db.Database.Migrate(); 
    // } 
} 
+0

爲什麼不直接調用步驟來解決'db.Database.Migrate()'的'配置()'方法的結束?連接字符串設置後。 –

+0

如果我將'ClientContext db'參數添加到'Configure'方法中,'ClientContext'將在Configure'調用之前被實例化。 'ClientContext'獲取'options'作爲構造函數參數,該構造函數參數試圖在'Configuration'對象被配置(或事件實例化)之前檢索'AppService'連接字符串。或者我的理解錯了? – alik

回答

1

根據你上面的評論我要試試這個:

public void Configure(IApplicationBuilder app, IServiceProvider serviceProvider) 
{ 
    app.UseMvc(); 

    this.Configuration = new ConfigurationBuilder() 
     .SetBasePath(env.ContentRootPath) 
     .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) 
     .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
     .AddEnvironmentVariables() 
     .Build(); 

    var db = serviceProvider.GetService<ClientContext>(); 
    db.Database.Migrate(); 
} 

這是手動解決環境變量已成立後ClientContext,因此它不會失敗的參數注入。

編輯:你得到的錯誤可以按照this SO question

+0

我想ClientContext的生命週期是由運行時管理的,所以不需要添加「using」語句,對吧? – alik

+0

我得到'無法解析根提供程序的範圍服務'AppService.ClientContext'。 – alik

+1

看到我上面的編輯,沒有點我重寫這些步驟以及:-) –

相關問題