7

Das ist eine lange Frage, aber ich wäre sehr, sehr dankbar, wenn ich dazu einen guten Rat bekommen könnte. Kurz gesagt, ich suche nach einem guten Ansatz für die Versionsaktualisierung des MS SQL-Datenbankschemas, das auch verlangt, dass Daten von gelöschten Tabellen in neue Tabellen verschoben werden.So vermeiden Sie Datenverlust mit EF Model Erste Aktualisierung des Datenbankschemas?

Ich denke, Stack Overflow ist der am besten geeignete Ort für diese Frage (nicht dba.stackexchange.com), denn im Kern ist dies ein Problem für .NET-Entwickler mit Entity Framework, und die Datenbank Teile davon besteht hauptsächlich aus automatisch generierte SQL-Skripte.


Hintergrund

Eine .NET-Anwendung und SQL-Datenbank ist in Azure (Die Anwendung im Arbeits Rolle und die Datenbank in Azure SQL) ausgeführt wird. Bis jetzt haben Versionsupgrades funktioniert, da alle Änderungen am Datenbankschema einfach waren (wie das Hinzufügen einer neuen Spalte). Von jetzt an muss ich aber auch während der Upgrades mit dem Verschieben von Daten von einer Tabelle zu einer anderen arbeiten. (Ich kann das vorübergehend beheben, indem ich eine neue Datenbank erstelle, ein Skript mit Daten aus der alten Datenbank erzeuge und das Skript manuell bearbeite, um es an das neue Schema anzupassen, aber ich hoffe, dass es einen besseren Ansatz gibt).

Ich benutze Entity Framework und ich verwende Model First. Entitäten und Zuordnungen werden in Visual Studio Data Model Designer definiert, und dieser Ansatz ist für meine Anwendung sehr geeignet.

Ich benutze einen Dacpac, um die Azure SQL-Datenbank zu aktualisieren, und dieser Ansatz hat bis jetzt gut funktioniert (aber jetzt werde ich Datenverlust bekommen, so muss ich jetzt eine Möglichkeit finden, Daten in neue Tabellen zu verschieben).

Ich hoffe, ich kann weiterhin Entity Framework und Definieren von Entitäten/Zuordnungen im Designer verwenden, aber es ist in Ordnung, bei Bedarf von dacpac Upgrade auf eine andere Technologie zu wechseln.

Upgrade-Ansatz bisher

  1. ich neue Einheiten hinzufügen (Tabellen), Verbände (Relationen) und Eigenschaften (Spalten) in dem Designer.
  2. Ich rechte Maustaste, wählen Sie "Datenbank aus Modell generieren ..." und dies führt zu einem SQL-Skript, das alte Datenbankobjekte löscht und die neuen Datenbankobjekte erstellt.
  3. Ich erstelle eine leere Datenbank und führe das Skript zum Erstellen der Tabellen/Schlüssel etc.
  4. In SQL Server Management Studio, klicken Sie mit der rechten Maustaste auf die Datenbank und wählen Sie "Aufgaben -> Daten-Tier-Anwendung extrahieren ...". Wenn der Assistent fertig ist, bekomme ich den benötigten dacpac (Eigentlich kann ich jetzt die Datenbank löschen, da ich sie nur erstellt habe, um die dacpac-Datei holen zu können, da ich glaube, dass ich sie nicht in Visual Studio Data Model Designer erzeugen kann) .
  5. Ich mit der rechten Maustaste auf die Azure SQL-Datenbank und wählen Sie "Aufgaben -> Upgrade Data-Tier-Anwendung ..." und folgen Sie dem Assistenten. Bis jetzt hatte ich noch nie einen Datenverlust, das hat also gut funktioniert!

aktuelle Situation

Dies ist ein vereinfachtes Beispiel, das Problem zu veranschaulichen, aber ich werde ab jetzt in fast identische Situationen oft auskommen es scheint. Sehen Sie sich die alte und die neue Version des Schemas in der folgenden Abbildung an. Angenommen, in der Datenbank sind bereits Daten vorhanden. Ich brauche die Daten in ImageFile, um in ImageFileOriginal oder ImageFileProcessed abhängig vom IsOriginal boolean/Bit-Wert zu enden. Mit "Upgrade Data-Tier Application" werde ich auf Datenverlust aufmerksam gemacht. Welchen Ansatz würdest du empfehlen, damit umzugehen?Wie ich bereits sagte, ist es in Ordnung, bei Bedarf von einem Dacpac-Upgrade auf eine andere Technologie umzusteigen.

Old schema New schema

Ich habe über Visual Studio Datenbankprojekte, Fluent Migrator, Red Gate und Entity-Designer Datenbank-Generation Power Pack lesen (nicht Visual Studio 2012 unterstützt), aber ich habe keine gefunden guter Weg dafür. Ich gebe zu, dass ich nicht einen ganzen Tag damit verbracht habe, in jede Technologie zu graben, aber ich verbrachte sicherlich einige Zeit, um zu versuchen, einen guten Ansatz zu finden.

Antwort

0

In der Configuration Klasse das Konstruktor wie unten beschrieben:

public Configuration() 
{ 
    AutomaticMigrationsEnabled = true; 
    AutomaticMigrationDataLossAllowed = false; 
} 

Set der AutomaticMigrationEnabled Eigenschaft true bedeutet, dass wir erste Migration automatischen Code verwenden und eine andere Eigenschaft AutomaticMigrationDataLossAllowed auf false gesetzt ist, bedeutet, dass keine vorhandenen Daten bei der Migration von dieser Migration der Tabelle der Datenbank verloren. Die gesamte Configuration Klasse ist wie folgt.