2016-07-05 13 views
3

Zur Zeit habe ich einen Dienst, der mit einer DB mit Entity Framework interagiert. Wenn es startet, initialisiert es die DB mit MigrateDatabaseToLatestVersion<Context, Configuration> und es funktioniert gut.Rollback Entity Framework-Migrationen in C#

Die Situation ist so, dass wir mit einer Ausnahme einen Punkt erreichen wollen, an dem wir aktive/Staging-Umgebungen haben: Beide kommunizieren mit derselben DB (ich habe keine Kontrolle darüber).

Also, jetzt, wenn ich Bereitstellung bereitstellen, stelle ich den Dienst als aus. Wenn wir die Bereitstellung mit Produktion wechseln, deaktiviere ich den Produktionsdienst, starte den Staging-Dienst und migriert die Datenbank bei Bedarf weiter. Das funktioniert gut, und wir tun das in mehreren Umgebungen vor dem Start. Wenn es ein Problem gibt (nur einmal passiert), müssen wir manuell Update-Database '[previous migration name]' ausführen und dann alles zurück zum vorherigen Server schalten.

Ich möchte die Rückwärtsmigration auf die gleiche Weise automatisieren, die ich für die Migration nach vorne habe. Das heißt, wenn der Dienst gestartet wird und erkennt, dass sein Schema eine Version dahinter ist und die letzte Migration innerhalb der letzten x Tage stattgefunden hat, wird das Schema automatisch zurückgesetzt und jeder Datenverlust akzeptiert.

Ich bin nur nicht sicher, wie es geht.

Antwort

3

Sie können dies mit der DbMigrator Klasse erreichen. Sie können sich die Tabelle __MigrationHistory ansehen, bevor der Migrationscode gestartet wird, um zu sehen, auf welche Migration zurückgerollt werden soll. Use DbMigrator.Update(string), um eine bestimmte Migration für "update" anzugeben (Sie werden zurückgesetzt, weil Sie eine vorherige Migration angegeben haben).