Frage an ef-migrations, entity-framework – Wie verwende ich Migrationen für eine vorhandene Datenbank in der Produktion, die mit Entity Framework 4.1 erstellt wurde?

12

Ich habe ein System in der Produktion, das mit Entity Framework 4.1 Code First erstellt wurde. Jetzt habe ich ein Upgrade auf 4.3 durchgeführt und muss Migrationen anwenden, aber es gibt mehrere Anwendungsfälle, die ich behandeln muss:

Ein neuer Entwickler benötigt die von Grund auf neu erstellte Datenbank mit Startdaten. (DasSeed() Methode wendet auch einige eindeutige Indizes an.)Die Produktionsumgebung benötigt nur die nicht übernommenen Änderungen. (Beachten Sie jedoch, dass diese Datenbank in EF 4.1 erstellt wurde, das keine Migrationen enthält.)

Wie erstelle ich die Migrationen und einen oder mehrere Initialisierer, um beide Fälle abzudecken?

Deine Antwort

1   die antwort
27

Da Ihre Produktionsdatenbank mit EF 4.1 erstellt wurde, müssen Sie ein wenig arbeiten, um sie einsatzbereit zu machenMigrationen. Beginnen Sie mit einer Kopie Ihres aktuellen Produktionscodes, der in einer Entwicklungsumgebung ausgeführt wird.Stellen Sie sicher, dass die Entwicklerdatenbank nicht existiert.

Aktualisieren Sie das Projekt, um EF 4.3 (oder höher) mit Migrations zu verwenden, und erstellen Sie die anfängliche Migration, um eine Momentaufnahme der aktuellen Produktion zu erstellen.

Update-Package EntityFramework
Enable-Migrations
Add-Migration InitialCreate  

Ersetzen Sie Ihre Datenbankinitialisierer durch passenden Migrationscode.

Fügen Sie die Startdaten zuSeed() Methode derMigrations\Configuration.cs Datei. Beachten Sie, dass im Gegensatz zu derSeed() Methode In Initialisierern wird diese Methode jedes Mal ausgeführtUpdate-Database wird genannt. Möglicherweise müssen Zeilen aktualisiert (die Startdaten zurückgesetzt) ​​werden, anstatt sie einzufügen. DasAddOrUpdate() Methode kann dabei helfen.

Da Ihre eindeutigen Indecies jetzt mit Migrations erstellt werden können, sollten Sie sie zur Liste hinzufügenUp() Methode der InitialCreate-Migration. Sie können sie entweder an die Kette legenCreateTable() Anrufe über dieIndex() Methode, oder durch Aufrufen derCreateIndex() Methode.

Du kannst den ... benutzenMigrateDatabaseToLatestVersion Initialisierer jetzt zum Ausführen von Migrationen während der Initialisierung.

Holen Sie sich ein Skript, um Ihre Produktionsumgebung zu booten.

Update-Database -Script

In dem Skript, das generiert wird, möchten Sie fast alles löschen, da die Tabellen vorhanden sind. Die Teile, die Sie benötigen, sind dieCREATE TABLE [__MigrationHistory] undINSERT INTO [__MigrationHistory] Aussagen.

Optional können Sie dieEdmMetadata Tabelle, da es nicht mehr benötigt wird.

Sobald Sie diese Dinge erledigt haben, sollten Sie mit Migrationen einverstanden sein. Neue Entwickler können ausgeführt werdenUpdate-Database um die Datenbank von Grund auf neu zu erstellen, und Sie können ausführenUpdate-Database (oder verwenden Sie den Migrations-Initialisierer) für die Produktion, um dort zusätzliche Migrationen durchzuführen.

Das meiste davon ist in EF 5.0.0 immer noch wahr. Um von automatischen Migrationen zu expliziten Migrationen zu konvertieren, musste ich die meisten dieser Schritte ausführen. Albert Bori
+1 für Idempotenz. Josh Kodroff
Wenn es leer ist, war die Datenbank beim Ausführen bereits vorhandenAdd-Migration. Zeigen Sie auf eine Datenbank, die nicht vorhanden ist, um es ordnungsgemäß zu Gerüst zu erhalten. z.B.Add-Migration InitialCreate -ConnectionString 'Data Source=.\SQLEXPRESS;Initial Catalog=DummyDatabase;Integrated Security=True' -ConnectionProviderName System.Data.SqlClient bricelam
Das ist toll! Vielen Dank! Josh Kodroff

Verwandte Fragen