Zuerst habe ich diese Fragen / Antworten gelesen:
Das alles scheint für EF-Versionen vor EF5 zu sein, und meine Situation scheint nicht zu diesen Antworten zu passen. Lassen Sie mich meine Situation beschreiben.
Entity Framework | Reverse engineer code first
. Nun möchte ich automatische Migrationen ausprobieren, mit denen ich ein wenig Erfahrung in Ruby on Rails hatte. Folgendes habe ich getan:
Enable-Migrations
. Hatte ein paar Probleme wegen der Verbindungszeichenfolgen und welche app.config wurde verwendet, aber schließlich bekam es. Allerdings diese MSDN-Seite besagt, dass dies automatisch die erste Migration generiert haben sollte, um mich an den Punkt zu bringen, den ich kenne bin schon bei. Hat es nicht. Add-Migration InitialSchema
um zu erreichen, was in Schritt 1 nicht automatisch gemacht wurde. Das hat funktioniert. Add-Migration AddSerialToLogEntries
auszuführen, und es wurde Folgendes angezeigt: Aufgrund der folgenden Gründe konnte keine explizite Migration generiert werden explizite Migrationen sind ausstehend: [201307190100268_InitialSchema]. Wenden Sie die ausstehenden expliziten Migrationen an, bevor Sie versuchen, ein neue explizite Migration.
Der Versuch, die Migration auf meine vorhandene Datenbank anzuwenden, ist fehlgeschlagen, was nicht überraschend ist.
Die anderen Antworten, die ich oben erwähnt habe, sagten im Grunde, dass ich kein Glück habe, aber wie ich schon sagte, waren das ältere Versionen des Entity Framework. Habe ich irgendwelche Optionen hier?
Beim Schreiben dieser Frage dachte ich, dass ich SQL Server Management Studio verwenden könnte, um meine Daten in ein SQL-Skript zu exportieren, die gesamte Datenbank zu löschen, sie von EF erstellen zu lassen und dann die Skripts auszuführen, um meine Daten wiederherzustellen. .. Ich werde das morgen versuchen, wenn ich Zeit habe, aber ich würde gerne hören, ob es andere Möglichkeiten gibt, da ich mir nicht 100% sicher bin, dass das funktionieren würde, und würde es hassen, Fehler in den Daten zu haben, die in den Prozess eingefügt werden / p>
Ran Enable-Migrationen. Hatte ein bisschen Probleme wegen der Verbindungszeichenfolgen und welche app.config wurde verwendet, aber schließlich bekam es. Jedoch, Diese MSDN-Seite besagt, dass dies automatisch generiert werden sollte erste Migration, um mich zu dem Punkt zu bringen, an dem ich schon bin. Hat es nicht.
Ran Add-Migration InitialSchema um zu erreichen was nicht war automatisch in Schritt 1 getan. Das hat funktioniert.
Tatsächlich erstellt der Befehl enable-migrations
nur dann eine anfängliche Migration, wenn Ihre Datenbank bereits zuvor mit Code-First erstellt wurde. In diesem Fall enthält die Datenbank eine __MigrationHistory
-Tabelle. Wenn diese Tabelle nicht existiert (was der Fall ist, wenn Sie eine vorhandene Datenbank haben, die noch nie zuvor mit Code-First erstellt wurde), erstellt enable-migrations
nur die Klasse Configuration
. Sie müssen add-migration
manuell aufrufen, um die erste Migrationsklasse zu erstellen. Also, das Verhalten, das Sie gesehen haben, wird erwartet.
Im Allgemeinen ist das Verfahren zum Vorbereiten einer vorhandenen Datenbank für Migrationen wie folgt, wenn Sie EF 5 verwenden:
Rufen Sie enable-migrations
in der Paketmanagerkonsole auf. Ein Migrations
-Ordner in Ihrem Projekt und eine Configuration
-Klasse werden erstellt.
Öffnen Sie die Klasse Configuration
und setzen Sie im Konstruktor AutomaticMigrationsEnabled = false
(falls dies nicht bereits standardmäßig der Fall ist).
In der Paketmanager-Konsole rufen Sie
auf %Vor% "InitialSchema" ist nur ein Beispielname. Sie können es wie gewünscht benennen. Eine Klasse <Timestamp>_InitialSchema
wird erstellt, die von DbMigration
abgeleitet wird. Die Methoden Up
und Down
in dieser Klasse sind aufgrund des Flags -IgnoreChanges
leer. Ohne dieses Flag würde die Klasse eine Migration enthalten, um Ihr gesamtes Modell der Datenbank hinzuzufügen, was nicht gewünscht ist, da die vorhandene Datenbank bereits das Datenbankschema enthält.
Führen Sie update-database
in der Paketmanagerkonsole aus. Da die Methode Up
leer ist, führt dieses Update nichts mit dem vorhandenen Schema aus, außer es erstellt die Tabelle __MigrationHistory
(als Systemtabelle in Ihrer Datenbank) und fügt den ersten Datensatz zu dieser Tabelle hinzu ein Modell-Hash Ihres aktuellen EF-Modells.
Optionaler letzter Schritt: Wenn Sie mit automatischen Migrationen arbeiten möchten, öffnen Sie die Klasse Configuration
und setzen Sie AutomaticMigrationsEnabled = true
im Konstruktor. Wenn Sie mit codebasierten Migrationen fortfahren möchten, lassen Sie das Flag false
.
An dieser Stelle können Sie Änderungen an Ihrem Modell vornehmen. Jedes Mal, wenn Sie eine neue Migration mit add-migration
erstellen, wird diese vor der Änderung auf Ihrem Modell basieren und die Migrationsklasse enthält nur die erforderlichen Schemaänderungen.
Ich würde einen etwas anderen Ansatz vorschlagen, der Sie in einen Zustand versetzt, in dem Sie mithilfe von Migrationen Datenbanken in Ihrer Entwicklungsumgebung von Grund auf neu erstellen können:
Anstatt add-migration -IgnoreChanges InitialSchema
aufzurufen,
Versuchen Sie, die Generierung der anfänglichen Schemamigration zu aktivieren.
Wie Sie sagen, sollte dies passieren, wenn Sie zuerst angerufen haben
%Code%. Sie könnten versuchen, auf Ihre Datenbankverbindung zu zeigen
in einer nicht existierenden Datenbank, um dies zum Laufen zu bringen.
Als Ergebnis enthält Ihre Enable-Migrations
Migration die
Logik, um die Datenbank so zu erstellen, wie sie war
Reverse-Engineered es. Sie müssen den Inhalt des
InitialSchema
und Up()
, bis Sie alle Umgebungen bereitgestellt haben
die bereits eine vorhandene Datenbank haben.
Dann können Sie den Inhalt dieser Methoden auskommentieren und ab dann in Ihren Entwicklungsumgebungen können Sie die Datenbanken löschen und Erstelle sie mit
neu %Vor% und Sie haben die vollständigen Migrationen in Ihrem Down()
Tabelle. Dies ist wichtig, denn ohne sie können Sie keine neuen hinzufügen
Migrationen in der Zukunft.
Tags und Links .net c# entity-framework-5 code-first-migrations ef-database-first