2016-06-12 32 views
17

È possibile che l'API Web ASP di base assicuri che il DB venga migrato alla migrazione più recente utilizzando EF Core? So che questo può essere fatto attraverso la linea di comando, ma voglio farlo in modo programmatico.ASP - Core Migrate EF Core SQL DB all'avvio

Aggiornamento

Sulla base della risposta da Janshair Khan sono arrivato fino a questa classe helper:

using Microsoft.AspNetCore.Builder; 
using Microsoft.EntityFrameworkCore; 
using Microsoft.Extensions.DependencyInjection; 
using MyWebApi.Models; 

namespace MyWebApi 
{ 
    public static class DataSeeder 
    { 
     public static void SeedData(this IApplicationBuilder app) 
     { 
      var context = app.ApplicationServices.GetService<MyContext>(); 

      if (!context.Database.EnsureCreated()) 
       context.Database.Migrate(); 
     } 
    } 
} 

È possibile chiamare questo dal metodo Configure nel vostro Startup.cs come questo:

app.SeedData(); 
+0

ancora non fatto dovrebbe essere attuata con la prossima versione. Puoi utilizzare la soluzione alternativa che viene pubblicata di seguito da Khan. –

+0

Vedere le risposte di seguito. È necessario utilizzare ConfirmCreated o Migrate. Non entrambi. –

risposta

13

È possibile utilizzare

db.Database.EnsureCreated(); 

per ottenere il db aggiornato con il modello attuale. Se si desidera attivare le migrazioni (Se le migrazioni successive si sospetta), quindi utilizzare

db.Database.Migrate(); 

e mettere le migrazioni successive nel corso del tempo.

+0

ConfirmCreated() funziona correttamente Ma "context.Database.Migrate()" non esiste un metodo Migrate() perché? EF core – Floxy

10

Una nota dalla documentazione sulla chiamata alla db.Database.EnsureCreated():

Si noti che questa API non usa le migrazioni per creare il database. Nell'aggiunta , il database creato non può essere successivamente aggiornato utilizzando le migrazioni . Se si sta prendendo di mira un database relazionale e si utilizzano le migrazioni , è possibile utilizzare il metodo DbContext.Database.Migrate() su assicurarsi che il database sia stato creato e tutte le migrazioni siano state applicate.

Si può semplicemente voler chiamare db.Database.Migrate().

Commento preso dalla sorgente trovata sopra la dichiarazione here.

1

Sulla base della risposta del @steamrolla proporrei la seguente miglioramento:

public static class EnsureMigration 
{ 
    public static void EnsureMigrationOfContext<T>(this IApplicationBuilder app) where T:DbContext 
    { 
     var context = app.ApplicationServices.GetService<T>(); 
     context.Database.Migrate(); 
    } 
} 

Con questo si può anche assicurare la migrazione di diversi contesti, per esempio se hai un database di identità.

Usage:

app.EnsureMigrationOfContext<context>(); 
0

Usa sotto il codice per eseguire la migrazione a

public async void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope()) 
    { 
     var context = serviceScope.ServiceProvider.GetService<YourContext`enter code here`>(); 
     context.Database.Migrate(); 
    } 
} 
Problemi correlati