Aktualisieren Sie vorhandene Datenbank mit Entity Framework Code zuerst in MVC

8

In meiner MVC-Anwendung habe ich Entity Framework 6 verwendet und eine Datenbank mit dem Code First Approach erstellt. Nach einer gewissen Zeit habe ich eine der Entitätsklassen aktualisiert, indem ich eine neue Spalte hinzugefügt und einige Spalten entfernt habe. Um diese Änderungen in der Datenbank widerzuspiegeln, habe ich die folgenden Schritte ausgeführt:

  
  1. Der Migrationsordner wurde im Projekt gelöscht.
  2.   
  3. Die Tabelle __MigrationHistory in der Datenbank wurde gelöscht.
  4.   
  5. Führen Sie anschließend den folgenden Befehl in der Package Manager-Konsole aus:
    Enable-Migrations -EnableAutomaticMigrations -Force

  6.   
  7. Fügen Sie die folgenden Zeilen in die Konfigurationsdatei ein:
      AutomaticMigrationsEnabled = true;
              AutomaticMigrationDataLossAllowed = true;

  8.   
  9. Ausführen:
    Add-Migration Initial

  10.   
  11. Und schließlich: run:
    Update-Datenbank -Verbose
  12.   

Ich erhalte jedoch einen Fehler "In der Datenbank befindet sich bereits ein Objekt mit dem Namen 'xxx'."

Um dieses Problem zu beheben, kommentiere ich den Code in der Up-Methode in der ursprünglichen Datei, die nach dem fünften Schritt erstellt wurde. Dies verhindert den Fehler, aber in der Datenbank wird nichts geändert (die aktualisierten Entitätstabellen bleiben wie zuvor). Wo ist der Fehler? Vielen Dank im Voraus für Ihre Hilfe.

Hier ist die Up-Methode, die ich in der Datei migration.cs kommentiert habe:

%Vor%


Und das ist die Down-Methode in der Datei migration.cs:

%Vor%     
Clint Eastwood 16.02.2015, 18:25
quelle

2 Antworten

9

Warum hast du die Schritte 1-4 gemacht? Da bist du falsch gelaufen. Wenn Sie eine zuvor generierte Datenbank hatten und nur Änderungen am Schema vornehmen, erstellen Sie einfach eine Migration und wenden Sie sie an. Indem Sie die Schritte 1 bis 4 ausführen, heben Sie effektiv das Wissen von Entity Framework über diese Datenbank auf und enden im Wesentlichen mit Code-First mit einer vorhandenen Datenbank. An diesem Punkt müssen Sie entweder Ihr Schema manuell ändern oder lassen Sie Entity Framework es ausblasen und neu beginnen.

Wenn Sie wieder in einen Zustand zurückkehren, in dem Sie Migrationen erneut anwenden können, waren Sie beim Erstellen einer Migration und dem Entleeren der Methode Up auf dem richtigen Weg. Sie müssen dies jedoch für den vorherigen Zustand Ihrer Anwendung tun, d. H. Für denjenigen, der der aktuellen Datenbank entspricht. Andernfalls generiert Entity Framework Create-Tabellen, die Ihre Codeänderungen enthalten. Die folgenden Schritte sind also:

  1. Setzen Sie Ihren Code auf den Punkt zurück, an dem Sie Ihre POCOs geändert haben.
  2. Eine Migration generieren.
  3. Entfernen Sie alles in der Methode Up
  4. Übernehmen Sie die Migration mit update-database
  5. Nehmen Sie die Änderungen, die Sie an Ihren POCOs vorgenommen haben, erneut an.
  6. Erstellen Sie eine weitere Migration (diese sollte jetzt nur add / alter Spaltenanweisungen anstelle von Tabellen erstellen)
  7. Übernehmen Sie die Migration.

Danach solltest du gut sein, wieder zu gehen. Wenn Sie das nächste Mal Code-Änderungen vornehmen, folgen Sie einfach den Schritten 5 & amp; 6.

    
Chris Pratt 16.02.2015, 20:46
quelle
4

Ich hatte genau dieses Problem. Scheint, dass es Befehle gibt, die in dieser Situation helfen, nämlich die Flags -IgnoreChanges und -Force.

Ich habe das Trimmen von einem Multi-dbContext zu einer einzelnen dbContext-App durchgeführt. Wie Sie erraten können, existierten die Tabellen bereits, aber der einzelne Kontext new nichts von den Tabellen, die im zweiten Kontext gepflegt wurden.

Es ist eigentlich ziemlich einfach (wenn auch 2 Tage der Suche nach der Antwort ohne Erfolg führte mich zu lesen auf der Kommandozeilen von EF Code First Migrations und der Paketmanager ...) So habe ich das gehandhabt.

Sie könnten den Migrationsordner und die _Migrations-Tabelle in SQL löschen. Dies würde dann dazu führen, dass Sie Folgendes benötigen: Aktivieren-Migrationen -Force

Aber Sie sollten in der Lage sein, von hier aus aufzugreifen, ohne drastische Maßnahmen zu ergreifen:

  1. Add-migration "Zurücksetzen" -IgnoreChanges -Force (unterdrückt zwangsweise Änderungen, die möglicherweise in Ihrem Modell / Ihrer Klasse vorhanden sind - gut für den Einstieg in die vorhandene Datenbank)
  2. Update-Datenbank (schreibt einfach Migrationslinie als Basis)
  3. Add-migration "AddMyMigrationsToThisDb" -Force (forciert iteratives Objektmodell im Code, um Änderungen aufzunehmen)
  4. Update-Datenbank

Jetzt sollten Sie wieder auf dem richtigen Weg sein, nur Add-Migration und Update-Datenbank ohne die zusätzlichen Flags zu verwenden.

    
John Salewski 20.03.2015 16:45
quelle