BigBastis Blog

Entity Framework Code First und Datenbank Migration

Introduction

user

Sebastian Gross

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.NET

Entity Framework Code First und Datenbank Migration

Posted on .

Das Entity Framework Code First ist ein feine Sache wenn man keine Lust auf SQL hat und diese lästigen CRUD Funktionen für die Datenbank jemand anders machen lassen will.

Besonders zu Beginn eines Projekts ist es super bequem den DropCreateDatabaseAlways-Initialisierer zu benutzen, der einem bei jeder Modeländerung eine frische und an das neue Model aktuelle Datenbank generiert. Doch irgendwann läuft die Applikation und man hat diverse Testdaten gespeichert die man nicht verlieren will, oder die App wurde nun schon installiert und ein Update steht bevor – was nun?

Natürlich kann man die Datenbank nicht mehr einfach neu erstellen mit DropCreateDatabaseAlways da dann auch alle Daten verloren gehen. Man muss die Datenbank aktualisieren, und genau hier kommen die Entity Framework Migrations ins Spiel, die seit der Version 4.3 Bestandteil des EF sind.

Falls ihr noch eine alte Version von EF verwendet solltet ihr NuGet anschmeißen und die neue Version installieren:

Ich würde euch empfehlen nun den CreateDatabaseIfNotExists-Initialisierer für eure Datenbank zu nutzen, um eure Daten nach der Modeländerung nicht zu verlieren.

Wenn ihr nun euer model ändert und versucht die App zu starten solltet ihr diesen Fehler zu sehen bekommen:

”The model backing the ‚YourDBContext‘ context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).” 

1. Nun müssen wir aktiv werden und die Datenbank-Migration aktivieren

Dazu führen wir den Befehl „Enable-Migrations“ auf der NuGet Konsole aus. Dieses Kommando legt einen neuen Ordner namens „Migrations“ in eurem Projekt an.

In diesem Ordner werdet ihr eine „Configurations“-Klasse finden, die ca so aussehen sollte:


internal sealed class Configuration : DbMigrationsConfiguration
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
    }

    protected override void Seed(DB context)
    {
        //  This method will be called after migrating to the latest version.

        //  You can use the DbSet.AddOrUpdate() helper extension method 
        //  to avoid creating duplicate seed data. E.g.
        //
        //    context.People.AddOrUpdate(
        //      p => p.FullName,
        //      new Person { FullName = "Andrew Peters" },
        //      new Person { FullName = "Brice Lambson" },
        //      new Person { FullName = "Rowan Miller" }
        //    );
        //
    }
}

Dies sollte euch an eure Initialisierungs Klasse erinnern, denn hier habt ihr auch eine Seed-Methode, die nach der Migration ausgeführt wird und euch die Möglichkeit gibt direkt Daten in die Datenbank zu schreiben.

Ich würde weiterhin empfehlen den Konstruktor der Klasse um folgende Anweisung zu erweitern:


AutomaticMigrationDataLossAllowed = false;

Dies sorgt dafür, dass ihr keine Daten verliert wenn die Datenbank aktualisiert wird.

2. Erste Migration anlegen

Nun wind wir soweit, dass wir unsere erste Migration anlegen können, dies geschieht ebenfalls über die NuGet Konsole mit dem Befehl: „Add-Migration“ Anschließend werdet ihr noch nach einem Namen für die Migration gefragt, hier könnt ihr eure Fantasie benutzen 😉

Es wird nun eine weitere Klasse in eurem Migrations-Ordner angelegt, diese hat ein Timestamp und eure Bezeichnung im Namen. Die Klasse ist in eine Up- & Down-Methode aufgeteilt, in der jeweils die Aktionen gespeichert sind, die nötig sind um die gewünschten Änderungen an der Datenbank durchzuführen oder diese Änderungen wieder rückgängig zu machen.


public partial class Initial : DbMigration
{
    public override void Up()
    {
    }

    public override void Down()
    {
    }
}

3. Migration durchführen

Nun können wir damit beginnen die Datenbank zu verändern. Hier haben wir nun zwei Möglichkeiten.

1. Direktes Update durchführen über die NuGet Konsole
2. Ein SQL Skript erzeugen und dieses dann auf dem SQl-Server ausführen

Da ich auf meinem Entwicklungsrechner keine Verbindung zu der Produktivumgebung habe, erzeuge ich eigentlich immer SQL Skripte, die ich dann auf der Remote-Maschine benutze um die Datenbank zu aktualisieren.

1. Direkt Update

Dazu nutzen wir den Befehl „Update-Database“.  Dadurch wird die Datenbank auf die neueste Version aktualisiert. Wenn ihr auf einen Spezifischen Stand updaten oder downgraden wollt könnt ihr den Stand über den Parameter „-TargetMigration=$“ machen. „Update-Database -TargetMigration=XXX„.

Falls ihr einen älteren Stand angebt, werden die Down-Methoden der aktuelleren Migrationsklassen aufgerufen.

2. SQL Skript erzeugen

Wenn ihr dem „Update-Database“ Befehl den „-Script“ Parameter übergebt, wird für euch ein Migrations Skript angelegt, dass alle nötigen Änderungen enthält. Diese betreffen auch die Downgrades, falls ihr einen älderen Stand als Ziel angebt.

Dieses SQL Skript kann dann problemlos auf dem SQL Server eingespielt werden und verhält sich genau wie eine „Direkte“ Migration.

Zusammenfassung

Die Entity Framework Datenbank Migration ist eine sehr bequeme Art die Datenbank auf seinem Testsystem und auch auf dem Zielsystem zu aktualisieren. Vor Allem ist es cool, dass ich jederzeit auch Zwischenreleases wiederherstellen kann.

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.

There are no comments.

Kommentar verfassen

View Comments (0) ...
Navigation