2016-06-12 14 views
17

Ist es möglich, dass meine ASP Core Web API sicherstellt, dass die DB mit EF Core auf die letzte Migration migriert wird? Ich weiß, dass dies über die Befehlszeile erfolgen kann, aber ich möchte es programmatisch machen.ASP - Core Migrieren von EF Core SQL DB beim Start

aktualisieren

Basierend auf der Antwort von Janshair Khan ich mit dieser Hilfsklasse kam:

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(); 
     } 
    } 
} 

Sie können dies Anruf aus der Configure Methode in Ihrer Startup.cs wie folgt aus:

app.SeedData(); 
+0

noch nicht getan, um es auszuführen mit der nächsten Version implementiert werden soll. Sie können die Workaround verwenden, die unten von Khan veröffentlicht wird. –

+0

Siehe die Antworten unten. Sie sollten entweder EnsureCreated oder Migrate verwenden. Nicht beide. –

Antwort

13

Sie können

012 verwenden
db.Database.EnsureCreated(); 

um Ihre db mit Ihrem aktuellen Modell zu aktualisieren. Wenn Sie Migrationen aktivieren möchten (Wenn nachfolgende Migrationen vermutet werden), dann

db.Database.Migrate(); 

verwenden und Ihre spätere Migrationen im Laufe der Zeit setzen.

+0

EnsureCreated() funktioniert gut Aber "context.Database.Migrate()" gibt es keine Migrate() -Methode, warum ist das? EF Kern – Floxy

10

Eine Notiz von der Dokumentation über den Aufruf von db.Database.EnsureCreated():

Beachten Sie, dass dieser API nicht Migrationen nicht verwenden, um die Datenbank zu erstellen. In Zusätzlich kann die Datenbank, die erstellt wird, nicht später aktualisiert werden, indem Migrationen verwendet werden. Wenn Sie eine relationale Datenbank targetieren und Migrationen verwenden, können Sie mithilfe der DbContext.Database.Migrate() -Methode sicherstellen, dass die Datenbank erstellt und alle Migrationen angewendet werden.

Sie möchten vielleicht nur db.Database.Migrate() anrufen.

Kommentar aus der oben angegebenen Quelle here.

1

Basierend auf der Antwort von @steamrolla ich die folgende Verbesserung vorschlagen würde:

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

Damit können Sie auch die Migration von verschiedenen Kontexten gewährleisten, z.B. wenn Sie eine Identitätsdatenbank haben.

Verbrauch:

app.EnsureMigrationOfContext<context>(); 
0

Verwenden Sie den folgenden Code Migration bei

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(); 
    } 
} 
Verwandte Themen