2016-07-05 11 views
5

Ich bin auf Entity Framework 6.0. Dies ist ein Entwicklungsproblem, nicht Production.EF Code Erste Datenbankinitialisierung und Migrationskonflikt

Ich denke, ich habe eine widersprüchliche Strategie an Ort und Stelle. Derzeit habe ich eine DropCreateDatabaseIfModelChanges Datenbankinitialisierer festgelegt und Migrationen aktiviert mit einer Startmethode in Configuration.cs. Beim Hinzufügen einer Migration und beim Ausführen der Update-Datenbank scheint es ein Glücksfall zu sein, wann die Datenbank gelöscht und neu erstellt wird und wann die Seed-Methode ausgeführt wird. Tatsache ist, es ist eine totale Lotterie, wenn beides passiert, und ich muss alle Arten von Tricks ziehen, um das Ding zur Arbeit zu bringen. Kann mir jemand sagen, ob es einen Konflikt gibt, wenn sowohl ein Datenbankinitialisierer als auch Migrationen aktiviert sind. Danke

Antwort

3

Das ist keine richtige Kombination. Es gibt einen MigrateDatabaseToLatestVersion Initialisierer für Migrationen.

Während der frühen Entwicklungsphase möchten Sie möglicherweise einen DropCreateDatabaseIfModelChanges-Initialisierer (oder CreateDatabaseIfNotExists) verwenden. Es gibt eine spezielle Seed() -Methode für Initialisierer, die nur ausgeführt wird, wenn die Datenbank erstellt wird.

Sobald Sie einen Punkt erreicht haben, an dem es schwierig ist, die Daten in der Datenbank wiederherzustellen, können Sie zu Migrationen wechseln. Ändern Sie Ihren Initialisierer und aktivieren Sie Migrationen. Stellen Sie sicher, dass Sie eine initial baseline migration (add-migration Initial -IgnoreChanges) hinzufügen, damit Sie erst nach diesem Punkt die Änderungen erhalten. Sie können jetzt die Migration hinzufügen, die bei jeder Aktualisierung der Datenbank ausgeführt wird, im Gegensatz zur Initialisierung, die nur dann ausgeführt wird, wenn die Datenbank erstellt wird.

Wenn Sie die Datenbank neu erstellen müssen, können Sie eine idempotent script generieren, die die Datenbank erstellt und alle Migrationen anwendet.

+0

Danke Steve, endlich eine comon Sinn Erklärung, wie dieses Zeug funktioniert. Ich habe bereits Migrationen aktiviert und 20 verschiedene Migrationen versucht, dieses Ding zum Laufen zu bringen. Daher ändere ich den Initialisierer in MigrateDatabaseToLatestVersion und verwende den Migrationssaat, um die Seed-Daten neu zu aktualisieren. – ShaunK

+0

Außerdem habe ich bereits eine erste Migration erstellt. Muss ich dies erneut mit -IgnoreChanges tun, und wenn ja, warum. Danke – ShaunK

+0

Hängt davon ab, ob Sie andere Datenbanken wie TEST, PROD oder andere Dev-Computer haben, die sich in unterschiedlichen Status befinden. Wenn das der Fall ist, müssen Sie alle auf der gleichen Seite finden. Wenn dies nur eine einzelne Datenbank ist und alle Ihre Änderungen angewendet wurden, können Sie alle Migrationen löschen, alle Datensätze in __MigrationHistory löschen und eine neue anfängliche Migration -IgnoreChanges durchführen. Jetzt werden alle Ihre Änderungen nachgeführt. –