Lies in den Artikel rein und unten bekommst Du ein unschlagbares Angebot!
Unter Access hatten Sie ein Problem, wenn Sie eine neue Version einer Datenbank ausliefern wollten, deren Datenmodell sich geändert hat. Dann war Handarbeit angesagt! Das Entity Framework bietet für das Übertragen von Änderungen am Datenmodell die sogenannten Migrationen an. Dieser Artikel zeigt, was es sich damit auf sich hat und wann Sie Migrationen gegenüber Datenbankinitialisierern nutzen sollten.
Wenn Sie eine Datenbank weiterentwickeln, die schon im produktiven Betrieb genutzt wird, gibt es verschiedene Änderungen, die unterschiedlich gehandhabt werden. Wenn Sie lediglich Änderungen an der Benutzeroberfläche oder an der Anwendungslogik vornehmen, haben Sie leichtes Spiel: Sie brauchen dann einfach nur die neue Version der Anwendung zu verteilen, die dann auf die vorhandene Datenbank zugreift.
Interessant wird es, wenn Sie nicht nur Änderungen an der Benutzeroberfläche oder der Anwendungslogik vornehmen, sondern wenn Sie das Entity Data Model manipulieren. Dann müssen nämlich auch die Tabellen in der zugrunde liegenden Datenbank angepasst werden, da sonst das Modell nicht mehr zur Datenbank passt. Hier wird es interessant, denn Entity Framework bietet die sogenannten Migrations, um Änderungen an den Entities zuverlässig in die Datenbank zu übertragen.
Während der Entwicklung der Anwendung, also bevor diese erstmals auf dem Rechner des Benutzers landet, ist der Umgang mit Aktualisierungen im Entity Data Model einfach: Man konnte dann einfach die komplette vorhandene Datenbank löschen und diese auf Basis des Entity Data Models neu aufbauen. Gegebenenfalls hat man dann noch mit der Seed-Methode einige Daten zu den frisch erstellten Tabellen hinzugefügt. Wie das im Detail funktioniert, erfahren Sie im Artikel Entity Framework: Datenbank-Initialisierer.
Sobald die Anwendung aber beim Kunden im Einsatz ist und dieser damit begonnen hat, Daten in die Tabellen zu schreiben oder diese zu ändern, kann man nicht mehr so einfach die komplette Datenbank löschen und neu erstellen – dann wäre die ganze Arbeit des Benutzers verloren. Alternativen wären das manuelle Schreiben von SQL-Anweisungen, mit denen die Änderungen im Entity Data Model feingranular in die Datenbank übertragen werde, ohne diese löschen und neu erstellen zu müssen. Oder man erstellt die Datenbank neu und erzeugt ein Skript, mit dem die Daten aus der Datenbank in der alten Version in die neue Version übertragen werden. Auch das ist mit viel Arbeit verbunden. Aber schauen wir uns doch an, was Entity Framework zu diesem Thema zu bieten hat.
Beispielprojekt
Das Beispielprojekt DatabaseMigrations auf Basis der Vorlage Visual Basic|WPF-App haben wir wieder mit einem neuen Element des Typs ADO.NET Entity Data Model namens ArticleContext ausgestattet, für das wir als Modellinhalt Leeres Code First-Modell gewählt haben. Dem Projekt haben wir dann einen neuen Ordner namens Data mit den beiden Klassen Article.cs und Category.cs hinzugefügt. Außerdem haben wir der durch Entity Framework erstellten Klasse ArticleContext.vb noch die beiden DbSet-Auflistungen Articles und Categories hinzugefügt (siehe Beispielprojekt).
Migrations
Dieses bietet nämlich eine Technik namens Migrations an. Dabei gibt es zwei verschiedene Funktionen:
- Code-basierte Migration: Muss durch den Entwickler ausgelöst werden.
- Automatische Migration: Erfolgt automatisch, hat aber Einschränkungen.
In den folgenden Abschnitten schauen wir uns die verschiedenen Funktionen an.
Code-basierte Migration
Die code-basierte Migration erfordert den Aufruf verschiedener Befehle über die Paket-Manager-Konsole. Diese starten Sie über den Menübefehl Extras|NuGet-Paket-Manager|Paket-Manager-Konsole. Hier können Sie die folgenden Anweisungen eingeben:
- Enable-Migrations: Aktiviert die Migration für das aktuelle Projekt und erstellt einen neuen Ordner namens Migrations mit einer neuen Klasse namens Configuration.
- Add-Migration: Erfasst die Unterschiede zwischen dem Entity Data Model im Vergleich zur Datenbank und trägt diese in jeweils eine neue Klasse in zwei Methoden namens Up und Down ein. Die Methoden enthalten die Anweisungen zum Erstellen, Löschen oder Ändern der Datenbankobjekte entsprechend den Änderungen im Entity Data Model.
- Update-Database: Diese Methode überträgt alle noch nicht übertragenen Änderungen aus den mit Add-Migration erstellten Klassen in die Tabellen der Datenbank.
Um die Migrations-Funktionen zu nutzen, müssen sie diese mit der ersten Anweisung Enable-Migrations aktivieren. Diese Anweisung setzen Sie in der Paket-Manager-Konsole ab (siehe Bild 1):
Bild 1: Aktivieren der Datenbank-Migrationen
Enable-Migrations
Dies quittiert die Paket-Manager-Konsole damit, dass Code First-Migrationen für das Projekt aktiviert sind. Was hat sich dadurch verändert Im Projektmappen-Explorer finden wir nun einen neuen Ordner namens Migrations mit der Klasse Configurations.vb (siehe Bild 2).