Datenbankmigrationen in C# (.NET): Vollständiger Leitfaden
Die Verwaltung von Änderungen am Datenbankschema ist eine kritische Aufgabe bei der Entwicklung jeder Anwendung in C# (.NET). Migrationen ermöglichen es, Änderungen an der DB-Struktur (Hinzufügen von Tabellen, Spalten, Indizes) zu versionieren, zu verfolgen und automatisch synchron zum Anwendungscode anzuwenden. Im .NET-Ökosystem gibt es mehrere ausgereifte Werkzeuge für diese Aufgabe. In diesem Artikel werden wir drei Hauptansätze im Detail besprechen: den integrierten Mechanismus von Entity Framework Core sowie die spezialisierten Bibliotheken FluentMigrator und DbUp.
1. Entity Framework Core Migrations (EF Core)
Der beliebteste Ansatz für Projekte, die bereits das ORM Entity Framework Core verwenden. Die Migrationen sind eng mit Ihrem Datenmodell integriert (Code-First-Ansatz).
Installation und Konfiguration
Für die Arbeit mit Migrationen müssen Sie das folgende Paket installieren:
dotnet add package Microsoft.EntityFrameworkCore.ToolsErstellen und Anwenden einer Migration
Nachdem Sie Ihre C#-Modelle geändert haben (z. B. Hinzufügen einer neuen Eigenschaft Email zur Klasse User), führen Sie im Terminal Folgendes aus:
dotnet ef migrations add AddEmailToUserdotnet ef database updateDer erste Befehl erstellt eine Migrationsdatei mit automatisch generiertem C#-Code. Der zweite wendet sie auf Ihre Datenbank an.
Beispiel für Migrationscode (generierte Datei):
public partial class AddEmailToUser : Migration{ protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.AddColumn<string>( name: "Email", table: "Users", type: "nvarchar(200)", nullable: true); }
protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropColumn( name: "Email", table: "Users"); }}Die Methode Up wendet Änderungen an, Down macht sie rückgängig.
Vorteile und Nachteile von EF Core Migrations
- Vorteile: Enge Integration mit Modellen, automatische Codegenerierung, Unterstützung für Rollbacks, in das .NET-Ökosystem integriert.
- Nachteile: Bindung an EF Core, Komplexität bei nicht-trivialen Änderungen (z. B. Umbenennung von Spalten), mögliche Probleme mit Konflikten im Team.
2. FluentMigrator
Dies ist eine unabhängige, leichtgewichtige Bibliothek für Migrationen, die nicht an ein bestimmtes ORM gebunden ist. Migrationen werden manuell in C# unter Verwendung einer fluent-Schnittstelle geschrieben.
Installation
dotnet add package FluentMigratorBeispiel einer Migration
[Migration(202310010001)]public class CreateUserTable : Migration{ public override void Up() { Create.Table("Users") .WithColumn("Id").AsInt32().PrimaryKey().Identity() .WithColumn("Name").AsString(100).NotNullable() .WithColumn("Email").AsString(200).Nullable(); Create.Index("IX_Users_Email") .OnTable("Users") .OnColumn("Email"); }
public override void Down() { Delete.Table("Users"); }}Ausführen von Migrationen
Für die Ausführung von Migrationen wird ein Runner verwendet. Beispielkonfiguration in Program.cs:
var serviceProvider = new ServiceCollection() .AddFluentMigratorCore() .ConfigureRunner(rb => rb .AddSqlServer() .WithGlobalConnectionString("YourConnectionString") .ScanIn(typeof(CreateUserTable).Assembly).For.Migrations()) .BuildServiceProvider();
using var scope = serviceProvider.CreateScope();var runner = scope.ServiceProvider.GetRequiredService<IMigrationRunner>();runner.MigrateUp();