ASP.NET Core Web API mit EF Core Code First Ansatz - Migrations
Ich möchte zunächst einige fundamentale Begriffe und Ansätze erläutern, um anschließend anhand eines Beispiels mit einer ASP.NET Core Web API und dem Entity Framework Core Code First Ansatz Migrations zu erstellen.
Es gibt verschiedene Möglichkeiten die Datenstruktur einer Datenbank zu modellieren. Model-First, Database-First und Code-First. Jeder Ansatz hat seine Vor- und Nachteile, wir beschäftigen uns hier allerdings mit dem Code-First Ansatz. Ich schneide die beiden anderen Möglichkeiten trotzdem kurz an.
Database-First
Beim Database-First Ansatz wird zunächst ein Modell aus einer bestehenden Datenbank generiert. Das Modell kann im Entity Framework Designer in einer EMDX-Datei gespeichert, angezeigt und bearbeitet werden. Beim Database-First Ansatz wird zunächst ein Modell aus einer bestehenden Datenbank generiert. Das Modell kann im Entity Framework Designer in einer EMDX-Datei gespeichert, angezeigt und bearbeitet werden.
Model-First
Beim Entity Framework Model-First Ansatz wird mit dem Entity Framework Designer ein Modell erstellt um anschließend ein Datenbankschema aus dem Modell zu generieren. Das Modell kann im Entity Framework Designer in einer EMDX-Datei gespeichert, angezeigt und bearbeitet werden.
Code-First
Beim Code First Ansatz werden Klassen und eine Verbindungszeichenfolge (connection string) erstellt, wodurch das Entity Framework automatisch eine Datenbank erstellen kann. Alle zukünftigen Änderungen und Erweiterungen an der Datenbank werden im Code vorgenommen. Code First Migrations bieten eine Möglichkeit das Datenbankschema einer Anwendung weiterzuentwickeln. Durch die Generierung von Migrations, können Änderungen am EF-Modell nachverfolgt und aktualisiert werden. Dieser Ansatz sehr hilfreich, wenn zu Projektbeginn noch nicht klar ist, wie die Datenbank später aussehen soll.
Entity Framework Core
Entity Framework Core ist eine Bibliothek, die aus der Anwendung heraus den Zugriff auf die Datenbank gewährt. Es wird als objektrelationaler Mapper (ORM) eingesetzt, um die Zuordnung zwischen relationaler Datenbank und dem Datenbankmodell der Anwendung zu gewährleisten. .NET Entwickler können somit unter Verwendung von .NET Objekten mit Datenbanken arbeiten und ersparen sich auf diese Weise einen Großteil des üblicherweise geschrieben Codes.
EF Core ist eine plattformübergreifende, erweiterbare Open Source Version der Entity-Framework Bibliothek.
Entity Framework Migrations
Mit Hilfe von Migrations können Datenbanken aktualisiert werden. Durch einen Zeitstempel im Dateinamen der Migrations sind diese chronologisch angeordnet, wodurch eine inkrementelle Aktualisierung des Datenbankschemas möglich ist. Somit kann das Datenbankmodell synchron gehalten werden, ohne Verlust bestehender Daten.
Jede Migration enthält die Vorgänge, die zum Durchführen bzw. rückgängig machen der Migration erforderlich sind. Eine Up() und eine Down() Methode
using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Migrations;
namespace migrations.Data.Migrations
{
public partial class Inital : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_AspNetUserRoles_UserId",
table: "AspNetUserRoles");
migrationBuilder.DropIndex(
name: "RoleNameIndex",
table: "AspNetRoles");
migrationBuilder.CreateIndex(
name: "RoleNameIndex",
table: "AspNetRoles",
column: "NormalizedName",
unique: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "RoleNameIndex",
table: "AspNetRoles");
migrationBuilder.CreateIndex(
name: "IX_AspNetUserRoles_UserId",
table: "AspNetUserRoles",
column: "UserId");
migrationBuilder.CreateIndex(
name: "RoleNameIndex",
table: "AspNetRoles",
column: "NormalizedName");
}
}
}
Generieren und Ausführen von Migrations
Die Package-Manager-Console (Paket-Manager-Konsole) rufst du über Tools / Library Package Manager / Package Manager Console (Extras / NuGet-Paket Manager / Paket-Manager-Konsole) auf.
Neue Migration hinzufügen
Package Manager Console
Add-Migration <name of migration>
CLI
dotnet ef migrations add <name of migration>
Migration entfernen
Package-Manager-Console
Remove-Migration
CLI
dotnet ef migrations remove
Datenbank aktualisieren
Die folgenden Befehle rufen die Up() Methoden der bis zu diesem Zeitpunkt erstellten Migrations auf und übernehmen alle Änderungen in die Datenbank.
Package Manager Console
Update-Database
CLI
dotnet ef database update
Stand einer vorherigen Migration wiederherstellen
Möchtest du den Stand einer vorherigen Migration wiederherstellen, füge den Namen der gewünschten Migration zur update-Methode hinzu. Die Migrations, die nach der "Zielmigration" ausgeführt wurden werden nicht gelöscht, lediglich die Down() Methoden werden durchgeführt. Um eine Migration endgültig zu löschen, benötigst du die remove-Methode.
Package-Manager-Console
Update-Database <name of migration>
CLI
dotnet ef database update <name of migration>
SQL Script generieren
Die folgenden Befehle generieren ein SQL-Script. Durch die Angabe einer -from und einer -to Migration kann eine Reichweite definiert werden. Des Weiteren kann ein idempotent-Script generiert werden, welche nur Migrations anwendet, die noch nicht für die Datenbank ausgeführt wurden.
Package Manager Console
Script-Migration
Script-Migration -Idempotent
CLI
dotnet ef migrations script