2013-10-02 3 views
19

Ich habe ein seltsames Problem mit ersten Codemigrationen in Entity Framework Version 5. Manchmal Update-Database schlägt aufgrund von ausstehenden Änderungen aber Add-Migration Befehl erzeugt nur Migrationen mit Datenbankänderungen bereits in den letzten Migrationen enthalten und die Datenbank ist auf dem neuesten Stand. Daher würde ich erwarten, dass die neue Migration leer ist.Warum erstellt Add-Migration manchmal doppelte Migrationen?

Wie erkennt Add-Migration, welche Änderungen fällig sind? Es scheint die Datenbank nicht als Quelle zu verwenden.

Antwort

35

Ein Snapshot des Datenbankmodells wird zusammen mit jeder Migration in einer RESX-Datei gespeichert. Wenn Sie eine neue Migration hinzufügen, vergleicht EF das aktuelle Datenbankmodell (das aus Ihren Modellklassen und -einstellungen von Ihrem DbModelBuilder generiert wird) mit der letzten Migration und ermittelt eine Änderung zwischen ihnen.

Das Problem, das Sie beschreiben, kann auftreten, wenn Ihre Migrationen nicht synchron sind. Es passiert uns, wenn zwei Entwickler zwei unabhängige Migrationen durchführen und diese Migrationen später wieder in den Standardzweig zusammengeführt werden.

Beispiel:

Entwickler 1

Migration AddColumnA

Entwickler 2

Migration AddColumnB

Merged Version

Migration AddColumnA - Datenbank-Snapshot columnA

Migration AddColumnB enthält - Datenbank-Snapshot enthält columnB aber nicht columnA

Wenn Sie eine weitere Migration hinzufügen, werden die Änderungen ermittelt gegen Migration AddColumnB, das enthält keine Informationen über SpalteA. Eine Umgehungsmöglichkeit für dieses Problem besteht darin, eine Dummy-Migration (mit leeren Up- und Down-Methoden) zu generieren, damit bei der letzten Migration der korrekte Snapshot des Datenbankmodells angezeigt wird.

Merged Version

Migration AddColumnA - Datenbank-Snapshot enthält columnA

Migration AddColumnB - Datenbank-Snapshot enthält columnB aber nicht columnA

Migration Dummy - Datenbank-Snapshot mit columnA und columnB

+1

Sehr interessant. Gibt es eine Möglichkeit zu verhindern, dass die Migrationen basierend auf dieser Ressourcendatei erstellt werden, sodass die Datenbank als Referenz verwendet wird? Dies ist meiner Meinung nach ein schwerwiegender Nachteil der Migrationen, da ich EXPLICIT-Migrationsdateien anstatt nur der automatischen Migration haben möchte, aber nicht mehrere Dummy-Migrationsdateien haben möchte, wenn ich mit mehreren Entwicklern in derselben Codebasis arbeite. –

+2

IMHO gibt es keine Möglichkeit, Datenbank als Referenz anzugeben.Anstatt eine Dummy-Migration zu erstellen, können Sie auf die erste Migration (AddColumnA) aktualisieren und dann die zweite Migration neu generieren. Die Up- und Down-Methoden bleiben gleich, aber der Datenbank-Snapshot wird auf die korrekte Version aktualisiert und eine Dummy-Migration ist nicht erforderlich. –

+0

Vielen Dank für alle Informationen, aber der Wechsel zwischen Revisionen für jede Zusammenführung ist viel mühseliger als "hässliche"/leere Merge-Migrationsdateien. Zumindest, wenn Sie jeden Tag eine oder mehrere Zusammenführungen machen. –