2016-09-07 1 views
0

Ich entwickle eine Windows-Anwendung, die SQL Server-Datenbank verwendet. Ich habe verschiedene Versionen dieser Anwendung und sie haben unterschiedliche Datenbankstruktur, so dass ich beim Start der Anwendung die Datenbank auf die neueste Version migrieren muss. Ich möchte die Datenbankstruktur mit dem Anwendungsmodell vergleichen und dann Befehle ändern, erstellen oder löschen.Code Erste und vorhandene Datenbank mit Daten

Auch ich möchte EF-Code-Erste ORM verwenden, nach ein paar Suchen habe ich herausgefunden, dass es einige nützliche Befehle und Konfigurationen im Code zuerst gibt. Aber das Problem ist, wie ich weiß, alle von ihnen die vorhandene Datenbank löschen und eine neue erstellen, so dass die Daten verloren gehen, während ich die Daten brauche.

benutzte ich diese Zeilen in meiner Anwendung Start-Funktion:

var migrator = new DbMigrator(new Configuration()); 
migrator.Update(); 

Aber nach dieser Zeile Ausführung werde ich diese Ausnahme erhalten:

There is already an object named 'SomeTable' in the database. 

Ich weiß, dass es richtig ist, und es ist, dass Tabelle aber in der Struktur ist geändert! Wie kann ich die Struktur vergleichen und den Rest erledigen?

Antwort

0

Das ist nicht how migrations work. Sie benötigen eine Migration für jede Version Ihrer Datenbank, damit EF die Tabelle __MigrationHistory überprüfen und sehen kann, ob sie angewendet wurde. Wenn Ihr Initialisierer auf MigrateDatabaseToLatestVersion eingestellt ist, wird Ihre Datenbank bei Modelländerungen nicht erneut erstellt.

Sie könnten versuchen, die Geschichte neu zu erstellen: in Ihre älteste Datenbank zurückrollen, eine Migration hinzufügen, 2. älteste Version Änderungen hinzufügen, eine zweite Migration erstellen usw.

Eine weitere Option ist es, eine Migration für wo Sie hinzufügen Jetzt generieren Sie ein Skript (update-database -Script) und kommentieren Sie dann das Zeug, das in jeder bereitgestellten Datenbank vorhanden ist, bevor Sie es anwenden.

Eine weitere Option wäre, die VS Schema compare utility für jede Datenbank und Ihre aktuelle Datenbank zu verwenden, um die Änderungen zu übernehmen. Wenden Sie anschließend eine Baseline-Migration auf jedes an (Hinzufügen-Migration Initial-IgnoreChanges).

Jetzt können Sie eine Reihe von Migrationen generieren und Ihr Code sollte wie erwartet funktionieren.

Verwandte Themen