Datenbankmigrationen in C# (.NET): Entity Framework Migrations

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Datenbankmigrationen in C# (.NET) mit Entity Framework

\n\n

Bei der Entwicklung von Anwendungen in C# (.NET) ist eine der Hauptaufgaben die Synchronisation des Datenmodells (C#-Klassen) mit dem Datenbankschema. Das manuelle Ändern von Tabellen, Spalten und Beziehungen ist ein zeitaufwändiger und fehleranfälliger Prozess. Die Lösung für dieses Problem sind Datenbankmigrationen, ein integrierter Mechanismus von Entity Framework (EF) Core oder Entity Framework 6. Migrationen ermöglichen es, Änderungen an der Datenbankstruktur basierend auf Codeänderungen automatisch anzuwenden, während vorhandene Daten erhalten bleiben.

\n\n

Was sind Migrationen und warum werden sie benötigt?

\n\n

Eine Migration ist eine Reihe von Anweisungen (C#-Code), die beschreiben, wie das Datenbankschema von einer Version auf eine andere geändert wird. Anstatt SQL-Skripte manuell zu schreiben, ändert der Entwickler die C#-Modelle (z. B. Hinzufügen einer neuen Eigenschaft zu einer Klasse), und EF generiert eine Migrationsdatei. Diese Datei wird dann auf die Datenbank angewendet.

\n\n
    \n
  • Automatisierung: Vermeidet manuelles Schreiben von SQL.
  • \n
  • Versionierung: Jede Migration ist eine separate Datei mit einem Zeitstempel, was das Zurücksetzen von Änderungen ermöglicht.
  • \n
  • Datensicherheit: Beim Hinzufügen einer Spalte löscht EF keine vorhandenen Zeilen (sofern nicht anders angegeben).
  • \n
  • Zusammenarbeit: Alle Teammitglieder wenden dieselben Migrationen an, was Schemaabweichungen vermeidet.
  • \n
\n\n

Projektvorbereitung

\n\n

Für die Arbeit mit Migrationen ist das installierte Paket Microsoft.EntityFrameworkCore.Tools (für EF Core) oder EntityFramework (für EF6) erforderlich. Installation über NuGet:

\n\n
// Für EF Core (über Package Manager Console)\nInstall-Package Microsoft.EntityFrameworkCore.Tools\n\n// Oder über .NET CLI\ndotnet add package Microsoft.EntityFrameworkCore.Tools\n
\n\n

Außerdem wird ein Datenbankkontext benötigt, der von DbContext abgeleitet ist. Beispiel eines einfachen Modells:

\n\n
public class Blog\n{\n    public int Id { get; set; }\n    public string Title { get; set; }\n    public string Content { get; set; }\n}\n\npublic class AppDbContext : DbContext\n{\n    public DbSet<Blog> Blogs { get; set; }\n\n    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)\n    {\n        optionsBuilder.UseSqlServer("Server=(localdb)\\\\mssqllocaldb;Database=MyBlogDb;Trusted_Connection=True;");\n    }\n}\n
\n\n

Erstellen der ersten Migration

\n\n

Öffnen Sie die Package Manager Console (in Visual Studio: View -> Other Windows -> Package Manager Console) oder verwenden Sie die .NET CLI. Führen Sie den Befehl aus:

\n\n
// Über PMC\nAdd-Migration InitialCreate\n\n// Oder über CLI\ndotnet ef migrations add InitialCreate\n
\n\n

Nach der Ausführung erscheint im Projekt ein Ordner Migrations mit zwei Dateien:

\n
    \n
  • XXXXXXXXXXXXXX_InitialCreate.cs – die Migrationsklasse mit den Methoden Up() (was zu ändern ist) und Down() (wie zurückgesetzt wird).
  • \n
  • AppDbContextModelSnapshot.cs – ein Snapshot des aktuellen Modells.
  • \n
\n\n

Anwenden der Migration auf die Datenbank

\n\n

Um die Datenbank zu erstellen oder auf die neueste Version zu aktualisieren, führen Sie Folgendes aus:

\n\n
// Über PMC\nUpdate-Database\n\n// Über CLI\ndotnet ef database update\n
\n\n

EF führt alle nicht angewendeten Migrationen der Reihe nach aus. Wenn die Datenbank nicht existiert, wird sie automatisch erstellt.

\n\n

Hinzufügen eines neuen Feldes und Erstellen einer Migration

\n\n

Angenommen, wir entscheiden uns, dem Modell Blog die Eigenschaft CreatedAt hinzuzufügen:

\n\n
public class Blog\n{\n    public int Id { get; set; }\n    public string Title { get; set; }\n    public string Content { get; set; }\n    public DateTime CreatedAt { get; set; } // neues Feld\n}\n
\n\n

Jetzt erstellen wir eine neue Migration:

\n\n
Add-Migration                    

Empfehlungen