MigrateDatabaseToLatestVersion nicht ausgeführt
Ich kann nicht herausfinden, warum meine Letzte migration ist nicht immer automatisch ausgeführt beim starten der Anwendung (oder zumindest bei dem erstmaligen Zugang wird der Kontext der Datenbank). Ich verwendet, um zu laufen update-Datenbank manuell in der Entwicklung, aber ich möchte, um zu testen, ob es automatisch aktualisiert werden soll auf meinem gehosteten test-Umgebung.
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 noch Hinzugefügt, das an den Konstruktor von FepazoContext:
public FepazoContext() : base("DefaultConnection")
{
Database.Initialize(false);
}
Einige zusätzliche Informationen:
- Die migration automatisch erstellt wurde, durch add-migration und sieht ok.
- Wenn ich die Abfrage der
__MigrationHistory
Tisch, ich kann sehen, dass die migration ist noch nicht 'aufgenommen' wie Sie ausgeführt werden. - Ich habe überprüft, dass die Initialisierung oder die
AutomaticMigrationsEnabled
Einstellung nicht überschrieben Web.config-Datei. - Haltepunkte in
FepazoContext
Konstruktor und dieFepazoConfiguration
sind erste Treffer.
Bin ich etwas vergessen ? Kann ich tiefer Graben, um herauszufinden, wo es schief geht ?
Updates
Vorbei True
zu Database.Initialize
zu versuchen und zu zwingen, die migration hat auch keine Wirkung. Database.CompatibleWithModel(true)
gibt false zurück - damit das system erkennt, es ist ein Unterschied, aber es funktioniert nicht führen Sie die anstehende migration!
public FepazoContext() : base("DefaultConnection")
{
if (!Database.CompatibleWithModel(true))
{
//This is executed (each time the code enters)
Database.Initialize(true);
}
}
Abhilfe
Als workaround rufe ich DbMigrator.Update()
ausdrücklich Recht nach der Einstellung der Initialisierung. Dass der trick funktioniert, obwohl ich würde immer noch gerne wissen, warum es funktioniert nicht automatisch...
protected void Application_Start()
{
//<...>
Database.SetInitializer<FepazoContext>(
new MigrateDatabaseToLatestVersion<FepazoContext, FepazoConfiguration>());
var dbMigrator = new DbMigrator(new FepazoConfiguration());
dbMigrator.Update();
//<...>
}
InformationsquelleAutor Vincent Sels | 2013-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut eine andere Antwort auf hier die Initialisierung nicht ausgeführt werden, bis es eine Interaktion mit der Datenbank. Die Antwort wird erläutert, wie zu zwingen, die Initialisierung sofort ausgeführt werden.
Database.Initialize(true);
ohne Wirkung. Leider ist die Lösung dieses Problems ist nicht so einfach 😉Wow, verbringe ich 15 min mit der Suche in diesem Thema, als ich angefangen habe meine app aber nicht einloggen (/Interaktion mit der Anwendung), denn es muss die Interaktion mit der DB zum ausführen der migration : ')
InformationsquelleAutor Appetere
Im obigen code-snippet, das Sie sind dem Aufruf der Datenbank.Initialize() Methode sofort nach dem anlegen einer context-Instanz. In diesem Fall wird die Datenbank erstellt werden, die sofort nach Aufruf der Initialize () - Methode, anstatt zu warten, bis sich der Kontext ist für die erste Zeit.
Die Initialize () - Methode akzeptiert einen booleschen parameter, der steuert, ob die Initialisierung sollte erneut ausgeführt werden, wenn er bereits ausgeführt für die Anwendung.
Angabe false überspringen Sie die Initialisierung, wenn es bereits ausgeführt. Ein Wert von wahr wird, initialisieren Sie die Datenbank erneut, auch wenn es bereits initialisiert ist.
true
als parameterDatabase.Initialize()
um das upgrade zu erzwingen, aber selbst das nicht, es auszuführen.InformationsquelleAutor SeyedPooya Soofbaf
Hatte ich dieses Problem. Mein problem war, dass ich hatte eine MigrationsContextFactory wurde verwendet, um die Verbindungszeichenfolge. Wenn der Datenbank-Initialisierung ausgeführt wurde, die migration Kontext Fabrik wurde gerufen. Diese MigrationsContextFactory war immer eine Verbindungszeichenfolge zu einer anderen Datenbank und wurde sichergestellt, der war up-to-date.
Entfernte ich die MigrationsContextFactory und übergeben Sie true, um
MigrateDatabaseToLatestVersion<,>
Migrator zu sagen, dass der aktuelle Kontext. Siehe diese Frage oben gestimmt Antwort Wie mache ich Spritzen einen connection-string in eine Instanz von IDbContextFactory<T>?IDatabaseInitializer<TContext>.InitializeDatabase(TContext)
angenommenTContext
parameter es immer nur mit dem mitgelieferten Rahmen. Alle anderen built-in-Initialisierungen haben nicht einmal diese Möglichkeit, so ist es seltsam, dass Sie gab es inkonsequent, Verhalten mit dem rest des Rahmens. (Sorry für die rant).InformationsquelleAutor GraemeMiller
Stellen Sie sicher, dass die MigrateDatabaseToLatestVersion wird mit dem richtigen Rahmen, der die Anwendung verwendet wird. Dies wird durch die Verwendung der parameter useSuppliedContext.
Nach dieser änderung, die meiner MVC Anwendung hat update meiner Datenbank.
InformationsquelleAutor Koen van der Linden