2012-03-29 13 views
6

Ich habe eine lokale Instanz einer Datenbank, die ich kürzlich erstellt mit DbContext.Database.Create(), so dass die __MigrationHistory Tabelle mit einem InitalCreate Eintrag, der den Code im Moment entspricht.Machen Sie EF4.3 Code First Migrationen ignorieren ausstehende Migrationen

Einige codebasierte Migrationen sind jedoch im Migrationsordner vorhanden. Diese werden in unseren Entwicklungs- und Staging-Umgebungen ausgeführt, um diese Datenbanken mit dem Code in Einklang zu bringen. Ich muss sie jedoch nicht lokal anwenden, da ich die Datenbank mit dem aktuellen Code erstellt habe.

Ich muss jetzt eine Änderung am Modell vornehmen und die entsprechende Migration erstellen. Aber wenn ich Add-Migration TestMigration laufen lasse, erhalte ich folgende Fehler

Unable to generate an explicit migration because the following explicit 
migrations are pending: 

[201203271113060_AddTableX, 
201203290856574_AlterColumnY] 

Apply the pending explicit migrations before attempting to generate 
a new explicit migration. 

Was soll ich in diesem Fall tun? Ich kann das Add-Migration-Tool nicht auf eine andere Umgebung verweisen, da nicht garantiert ist, dass die Version mit meinen lokal übereinstimmt. Ich möchte eine Migration, die nur den Änderungen entspricht, die ich vorgenommen habe.

Es scheint, ich habe ein paar Optionen, aber keine sind ideal:

  1. die anderen Migrationen aus dem Migrations-Ordner zu löschen, das Add-Migration Befehl ausführen, um die Datenbank aktualisieren, dann die alten Migrationen wiederherzustellen. Das ist einfach, wirkt aber etwas hackisch.
  2. Kehren Sie zu der Version des Modells in der Quellcodeverwaltung zurück, auf die die erste Migration angewendet wurde, erstellen Sie diese dann und verwenden Sie sie zum Erstellen der Datenbank. Erhalten Sie dann die neueste Version, wenden Sie alle Migrationen an und ich bin bereit, meine Migration hinzuzufügen. Das scheint eine Menge Mühe zu sein!
  3. Erstellen Sie die Migration manuell.

Hat jemand irgendwelche Vorschläge, wie dies zu verwalten ist?

Antwort

2

Was ich am besten funktioniert gefunden haben, ist sehr einfach: nicht DbContext.Database.Create() benutzen, wenn Sie aktiviert haben Migrationen. Wenn Sie eine neue Datenbank programmgesteuert erstellen möchten, verwenden Sie stattdessen die Migrations-API.

Dann haben Sie den vollständigen Migrationsverlauf und das Hinzufügen weiterer Migrationen funktioniert wie erwartet.

2

Wir planen eine Variante Ihrer Wahl # 1 zu verwenden ...

Unser Standard Operating Procedure ist ein SQL-Skript für jede Migration zu erzeugen (mit der Option -script von update-Datenbank), um SQL-Scripts, die von InstallShield auf Endbenutzer-Produktionsdatenbanken angewendet werden sollen (wir planen, die EF-Aktualisierungsdatenbank nur für Entwicklerdatenbanken zu verwenden).

Somit haben wir sowohl die Migrations-.cs-Dateien als auch die entsprechenden .sql-Dateien für alle Migrationen in unserem Migrations-Ordner.

Anstatt die Migrationen aus dem Migrations-Ordner zu löschen (wie in # 1 vorgeschlagen), verwenden wir SQL Mgmt Studio, um nur die Teile der .sql-Dateien manuell anzuwenden, die die Einfügungen in _MigrationHistory ausführen.

Das bringt die _MigrationHistory der lokalen Datenbank mit den Änderungen, die bereits in der Datenbank enthalten sind, auf den neuesten Stand.

Aber es ist ein Klotz, und wir suchen immer noch nach einer besseren Lösung.

DadCat

1

ich das gleiche Problem gestoßen sind. Wenn Sie laufen

Update-database 

und dann laufen

Add-Migration YourMigrationName 

Dies löst das Problem

+1

Dies funktioniert nicht, da frühere Migrationsoperationen nicht für eine Datenbank ausgeführt werden können, die mit 'DbContext.Database.Create()' erstellt wurde. Stellen Sie sich eine Migration vor, die eine Spalte hinzufügt, aber in Ihrer neuen lokalen Datenbank haben Sie diese Spalte bereits, so dass Sie eine 'SqlException' erhalten und die relevante Zeile niemals zur Tabelle' __MigrationHistory' hinzugefügt wird. Sehen Sie meine Antwort für das, was ich für richtig halte. –

1

Sie müssen entweder "update-database" von der Paketmanagerkonsole aus ausführen, um Ihre Änderungen an die Datenbank zu übertragen ODER Sie können die ausstehende Migrationsdatei ([201203271113060_AddTableX]) aus Ihrem Migrationsordner löschen und dann "add-migration" erneut ausführen "Erstellen Sie eine brandneue Migration basierend auf Ihren Änderungen.

0

einfach die alte Migrationsdatei aus den Lösungsdateien ausschließen.

Verwandte Themen