Die EF5-Migration mit der vorhandenen Datenbank kann nicht ausgeführt werden

8

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.

  1. Meine Anwendung wurde ursprünglich mit EF4 erstellt, zuerst mit dem Modell. Ich habe meine Datenbank mit dem GUI-Designer entworfen und verwendet, um meine Datenbank zu erstellen.
  2. Ich habe einige Monate lang Daten in der Datenbank gesammelt und gesammelt. Ich kann diese Daten wirklich nicht verlieren.
  3. Ich habe meinen Code verzweigt, EF5 mit NuGet installiert und EF Power Tools verwendet, um mein Modell aus meiner Datenbank zu generieren, indem ich mit der rechten Maustaste auf ein neues Klassenbibliotheksprojekt klicke und Entity Framework | Reverse engineer code first .
  4. auswähle
  5. Ich konnte problemlos auf mein neues Projekt referenzieren, mein Projekt konvertieren, um den neuen DbContext anstelle von ObjectContext zu verwenden, und die EF4-Klassenbibliothek entfernen, die mein altes Modell enthielt. Das Programm funktioniert großartig!

Nun möchte ich automatische Migrationen ausprobieren, mit denen ich ein wenig Erfahrung in Ruby on Rails hatte. Folgendes habe ich getan:

  1. Lief 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.
  2. Ran Add-Migration InitialSchema um zu erreichen, was in Schritt 1 nicht automatisch gemacht wurde. Das hat funktioniert.
  3. Eine Eigenschaft wurde zu einem meiner Modellobjekte hinzugefügt, dann wurde versucht, 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>     

Steve 19.07.2013, 01:28
quelle

2 Antworten

12
  

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.

    
Slauma 21.07.2013, 15:38
quelle
3

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:

  1. 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.

  2. 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.

  3. 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.

Joe Taylor 05.11.2013 16:39
quelle