Wie überspringen bisherigen ef-Migrationen auf eine neue Datenbank, die enthält bereits diese änderungen?
Dem Szenario, das ich habe Probleme mit ist Sie wie folgt vor:
- Code First-Modell erstellt mit EF 4.1 und die entsprechende Datenbank erzeugt
- EF Upgrade auf 4.3.1 und eine migration Hinzugefügt (mit IgnoreChanges, da keine änderungen des Modells), um zu starten mit Migrationen (__MigrtionHistory Tabelle erstellt und EdmMetadata gelöscht) - nennen wir es mal 'InitialMigration'
- - Modell geändert wird, sagen wir eine neue Eigenschaft Hinzugefügt wird und eine migration fügt hinzu, dass eine entsprechende Spalte erzeugt wird (wir nennen dies eine 'NewPropertyMigration') und dann angewendet, um ein Dev-Datenbank (mit unserer version Zu Migrieren, um die Letzte Initialisierung Strategie)
- Wenn der code gefördert werden, um die Produktion der Datenbank vorhanden ist, wird aktualisiert mit neuen Spalte als erwartet
- Dann, wenn eine völlig neue Datenbank erstellt wird, in Dev und weil es ist basierend auf den aktuellen Modell wird es gehören die neue Spalte, nachdem es erstellt wurde, aber wenn die Initialisierung Strategie ist, es laufen immer noch findet "InitialMigration' und 'NewPropertyMigration' als "ausstehend" aber Sie scheitern beide, weil EdmMetadata ist nicht da, also nichts entfernt werden und die neue Spalte ist bereits vorhanden, so können nicht hinzufügen
Wenn ich __MigrationHistory Tabelle auf dieser neuen Datenbank enthält nur 'InitialCreate' - Eintrag so, dass würde erklären, warum die beiden anderen Migrationen gelten als angemeldet. Aber ich kann nicht sehen, wie Sie überhaupt in diese Tabelle ohne angewendet wird und zur gleichen Zeit, die Sie nicht wirklich brauchen, um angewendet werden, weil die Datenbank enthält bereits alle änderungen, die Sie abdecken.
Was bin ich?
Werde ich nur hinzufügen, dass es scheint ein bisschen misstrauisch, dass die Model-Spalte in 'InitialCreate' ist im Unterschied zu dem in 'NewPropertyMigration', obwohl Sie repräsentieren das gleiche Modell. Könnte das die Ursache sein?
Update:
Dies ist der code, den ich verwenden, um erstellen Sie neue Datenbank und wenden Sie eine beliebige Migrationen automatisch zur gleichen Zeit
public class MigratePaymentsToLatestVersion<TContext> : IDatabaseInitializer<TContext> where TContext : DbContext
{
public void InitializeDatabase(TContext context)
{
//Create a brand new database if it doesn't exist but still apply any pending migrations
context.Database.CreateIfNotExists();
var migrator = new DbMigrator(configuration);
migrator.Update();
}
}
Update 2: Einfachere Szenario zeigen sich die gleichen problem
Während der Untersuchung dieses weiteren habe ich in der Lage zu reproduzieren, die das Verhalten in eine viel einfachere Szenario beschrieben:
- Erstellen einfache Modell und Kontext
- In einem test-Anwendung fügen Sie eine Einheit - mit allen default-Einstellungen der Datenbank wird automatisch erstellt und Objekt Hinzugefügt
- Ermöglichen Migrationen - 'InitialCreate' migration generiert
- Update-Datenbank - Befehl gibt keine ausstehenden Migrationen, weil 'InitialCreation' ist bereits in der __MigrationHistory
- Datenbank löschen und re-test-Anwendung - Datenbank wird automatisch neu erstellt, wieder
- An dieser Stelle kann ich nicht fügen Sie zusätzliche Migrationen oder führen Sie update-Datenbank, weil 'InitialCreation' migration gesehen wird als "ausstehend" kann aber nicht angewendet werden, weil alle Elemente schon vorhanden sind
- Wie hast du eine neue Datenbank erstellen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich es nun sortiert. Die entscheidende etwas fehlte mir scheint, dass in Bezug auf die Art und Weise, die Sie bewegen, von 4.1 auf 4.3. Ich habe folgenden Schritte aus ef-4-3-Migration-und-bestehende-Datenbank. Was scheint zu funktionieren, besser ist das Verfahren, beschrieben in der Frage ALSO how-to-use-Migration-auf-ein-bestehender-db.
Wenn Sie vergleichen, die beide von Ihnen werden Sie sehen, dass man stützt IgnoreChanges, wenn Sie erste migration (genannt 'InitialMigration'), während der andere erstellt eine vollständige 'InitialCreate' migration enthält das gesamte Modell an diesem Punkt in der Zeit. Zwei wichtige Konsequenzen des letzteren Ansatzes sind:
- bei der Schaffung einer Marke neue Datenbank InitialCreate migration, die enthält die vollständige definition des Modells wird verwendet, um die Datenbank erstellen, anstatt "den anderen code' (nicht genau, aber vermute, dass dies ist der Teil, der benötigt wird, wenn Migrationen sind nicht aktiviert ist), erzeugt die Datenbank basiert auf dem Modell
- neue Datenbank angelegt, mit up-to-date-Modell und mit allen Migrationen aufgeführt in __MigrationHistory
Also mit der InitialCreate Ansatz, den ich in der Lage bin zu gelten Migrationen bestehender Datenbanken (für Sie ist die InitialCreate wird einfach übersprungen, da ein Eintrag in der history Hinzugefügt wird manuell als Teil des Verfahrens) und zur gleichen Zeit bin ich in der Lage, erstellen Sie neue Datenbanken und neue Migrationen, um Sie ohne die Fehlermeldung erhalten, dass Modell und db sind out-of-sync.
Ich hoffe, dass hilft den Menschen, die, wie ich, folgte das erste Verfahren.