Datenbankmigrationen in C# (.NET) mit Entity Framework
\n\nBei 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\nWas sind Migrationen und warum werden sie benötigt?
\n\nEine 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
Projektvorbereitung
\n\nFü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\nAußerdem wird ein Datenbankkontext benötigt, der von DbContext abgeleitet ist. Beispiel eines einfachen Modells:
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\nErstellen 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\nNach der Ausführung erscheint im Projekt ein Ordner Migrations mit zwei Dateien:
\n- \n
XXXXXXXXXXXXXX_InitialCreate.cs– die Migrationsklasse mit den MethodenUp()(was zu ändern ist) undDown()(wie zurückgesetzt wird). \n AppDbContextModelSnapshot.cs– ein Snapshot des aktuellen Modells. \n
Anwenden der Migration auf die Datenbank
\n\nUm 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\nEF führt alle nicht angewendeten Migrationen der Reihe nach aus. Wenn die Datenbank nicht existiert, wird sie automatisch erstellt.
\n\nHinzufügen eines neuen Feldes und Erstellen einer Migration
\n\nAngenommen, wir entscheiden uns, dem Modell Blog die Eigenschaft CreatedAt hinzuzufügen:
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\nJetzt erstellen wir eine neue Migration:
\n\nAdd-Migration Auch in der Bibliothek
Aufgabenwarteschlangen in Swift: GCD, OperationQueue und Swift Concurrency
Awaitility für Java: Vollständige Anleitung mit Beispielen