11

Ich kann nicht herausfinden, warum meine letzte Migration nicht automatisch beim Start der Anwendung (oder zumindest beim ersten Zugriff auf den Datenbankkontext) ausgeführt wird. Ich habe update-database manuell in Entwicklung ausgeführt, aber ich möchte testen, ob es automatisch auf meiner gehosteten Testumgebung aktualisiert wird.MigrateDatabaseToLatestVersion nicht ausgeführt

In Application_Start():

Database.SetInitializer<FepazoContext>(
    new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>()) 

In FepazoConfiguration:

internal sealed class FepazoConfiguration : 
    DbMigrationsConfiguration<Fepazo.Models.FepazoContext> 
{ 
    public FepazoConfiguration() 
    { 
     AutomaticMigrationsEnabled = true; 
    } 
} 

ich auch diese an den Konstruktor FepazoContext hinzugefügt:

public FepazoContext() : base("DefaultConnection") 
{ 
    Database.Initialize(false); 
} 

Einige zusätzliche Informationen:

  • Die Migration wurde automatisch erstellt durch Add-Migration und sieht ok. Wenn ich die Tabelle __MigrationHistory abfrage, kann ich sehen, dass die Migration noch nicht als ausgeführt registriert wurde.
  • Ich habe überprüft, dass der Initialisierer oder die AutomaticMigrationsEnabled Einstellung in der Datei Web.config nicht überschrieben wird.
  • Breakpoints in FepazoContext Konstruktor und die FepazoConfigurationwerden bekommen getroffen.

Vergesse ich etwas? Kann ich tiefer graben, um herauszufinden, wo es schief geht?

Updates

Passing True-Database.Initialize zu versuchen und zu zwingen, die Migration auch keine Wirkung. Database.CompatibleWithModel(true) gibt false zurück - das System erkennt also einen Unterschied, führt jedoch die ausstehende Migration nicht aus!

public FepazoContext() : base("DefaultConnection") 
{ 
    if (!Database.CompatibleWithModel(true)) 
    { 
     // This is executed (each time the code enters) 
     Database.Initialize(true); 
    } 
} 

Umgehung

Als Abhilfe kann, nenne ich DbMigrator.Update() ausdrücklich direkt nach der Initialisierung zu setzen. Das funktioniert der Trick, obwohl ich immer noch wissen möchte, warum es nicht automatisch funktioniert ...

protected void Application_Start() 
{ 
    // <...> 
    Database.SetInitializer<FepazoContext>(
     new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>()); 
    var dbMigrator = new DbMigrator(new FepazoConfiguration()); 
    dbMigrator.Update(); 
    // <...> 
} 

Antwort

1

In dem obigen Code-Schnipsel Sie rufen die Database.Initialize() Methode sofort nach dem Erstellen eine Kontextinstanz In diesem Fall wird die Datenbank unmittelbar nach dem Aufruf der Initialize() - Methode erstellt, anstatt zu warten, bis der Kontext zum ersten Mal verwendet wird.

Die Initialize() -Methode verwendet einen booleschen Parameter, der steuert, ob der Initialisierungsprozess erneut ausgeführt werden soll, wenn er bereits für die Anwendung ausgeführt wurde.

Angabe false überspringt den Initialisierungsprozess, wenn es bereits ausgeführt wurde. Ein Wert von true initialisiert die Datenbank erneut, auch wenn sie bereits initialisiert wurde.

+0

Vielen Dank für Ihre Antwort. Das erklärt nicht, warum das System nicht erkennt, dass es die Datenbank mit der letzten Migration aktualisieren muss. Ich habe versucht, 'true' als Parameter zu' Database.Initialize() 'zu übergeben, um das Upgrade zu erzwingen, aber selbst das führt es nicht aus. –

6

Gemäß another answer on here wird der Initialisierer nicht ausgeführt, bis eine Interaktion mit der Datenbank stattfindet. In der Antwort wird erläutert, wie der Initializer zum sofortigen Ausführen erzwungen wird.

+0

Natürlich habe ich deshalb "(oder zumindest beim ersten Zugriff auf den Datenbankkontext)" in meinem ersten Satz hinzugefügt, und wieso habe ich gesagt, dass ich 'Database.Initialize (true);' ohne Wirkung versucht habe. Leider ist die Lösung für dieses Problem nicht so einfach;) –

+0

Wow, ich verbringe 15 Minuten damit, dieses Problem zu untersuchen, da ich meine App zwar nicht gestartet habe (/ Interaktion mit Anwendung), allerdings muss sie mit DB interagieren die Migration: ') – edencorbin

0

Ich hatte dieses Problem. Mein Problem stellte sich heraus, dass ich eine MigrationsContextFactory hatte, die verwendet wurde, um die Verbindungszeichenfolge bereitzustellen. Bei der Initialisierung der Datenbank wurde die Migrationskontextfactory aufgerufen. Diese MigrationsContextFactory erhielt eine Verbindungszeichenfolge zu einer anderen Datenbank und stellte sicher, dass sie aktuell war.

Ich habe die MigrationsContextFactory entfernt und den Wert MigrateDatabaseToLatestVersion<,> an Migrator übergeben, damit der aktuelle Kontext verwendet wird. Sehen Sie diese Frage nach oben abgestimmt Antwort How do I inject a connection string into an instance of IDbContextFactory<T>?