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 dieFepazoConfiguration
werden 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();
// <...>
}
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. –