2017-08-29 2 views
3

Ich habe in den letzten Monaten eine Versionsaktualisierung durchgeführt und jetzt habe ich festgestellt, dass wenn ich "remove-migration" zum Löschen der Migration verwende, die ich zurückgesetzt habe, meine App zuerst ausgeführt wird.Warum Remove-Migration meine App ausführen?

(Ich bemerkte, dass wir update-database innerhalb des startup, so dass ich eine Situation habe, wo ich Migrationen nicht entfernen kann, da jedes Mal, wenn ich versuche, die Migration zu entfernen) automatisch den Start ausgeführt, die die Migration auf db anwenden, dann scheiterte es löschen, da es in db zu sehen ist.)

keine idee?

Antwort

17

Wenn Sie ASP.NET Core 2.0/EF Core 2.0 verwenden, gibt es eine Änderung, um solche Fälle besser zu behandeln, damit die Befehlszeilentools besser funktionieren.

Es ist ziemlich gut in this announcement abgedeckt.

Es läuft auf eine statische BuildWebHost Methode, die die gesamte Anwendung konfiguriert, aber nicht ausgeführt wird.

public class Program 
    { 
     public static void Main(string[] args) 
     { 
      var host = BuildWebHost(args); 

      host.Run(); 
     } 

     // Tools will use this to get application services 
     public static IWebHost BuildWebHost(string[] args) => 
      new WebHostBuilder() 
       .UseKestrel() 
       .UseContentRoot(Directory.GetCurrentDirectory()) 
       .UseIISIntegration() 
       .UseStartup<Startup>() 
       .Build(); 
    } 

auch 2.0 mit EF ist es jetzt genannt empfohlen, die Migrationen auf die Hauptmethode nach BuildWebHost wurde zu bewegen. Zum Beispiel

public static void Main(string[] args) 
    { 
     var host = BuildWebHost(args) 
      .Migrate(); 

     host.Run(); 
    } 

Wo Migrate eine Erweiterung Methode ist:

public static IWebHost Migrate(this IWebHost webhost) 
{ 
    using (var scope = webhost.Services.GetService<IServiceScopeFactory>().CreateScope()) 
    { 
     using (var dbContext = scope.ServiceProvider.GetRequiredService<MyDbContext>()) 
     { 
      dbContext.Database.Migrate(); 
     } 
    } 
    return webhost; 
} 

Jetzt Migrationen nur dann ausgeführt, wenn die Anwendung ausgeführt wird. Wenn Sie Befehlszeilenprogramme ausführen, wird nur BuildWebHost aufgerufen und keine Migrationen angewendet.

+2

Wenn Sie das Code-Snippet direkt kopieren, ist es 'scope.ServiceProvider.GetRequiredService ()' – IvanJazz

Verwandte Themen