Vorrei eseguire automaticamente una migrazione del database all'avvio dell'applicazione in ASP.NET Core 2.0 e EntityFramework Core 2.0.
Ho trovato eseguire migrazioni di database utilizzando Entity Framework core all'avvio dell'applicazione . Tuttavia, le stringhe di connessione vengono archiviate nelle variabili di ambiente in modo che non vengano trovate finché non vengono chiamati .AddEnvironmentVariables()
nel metodo Configure
.
Come chiamare the db.Database.Migrate()
o come eseguire correttamente la migrazione del database (nell'app Web di Azure) tramite ambienti di distribuzione continua e di gestione temporanea?
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();
// }
}
Sulla base del tuo commento sopra vorrei provare questo:
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();
}
Questo risolve manualmente il ClientContext
dopo che le variabili di ambiente sono state impostate e pertanto non fallirà l'iniezione dei parametri.
EDIT: l'errore che stai ottenendo può essere risolto seguendo i passaggi in questa domanda SO