.NET Core Tipp: EF Core Tabellen umbenennen ohne Datenverlust

Problem

Eine Klasse, die als Entität in EF Core verwendet wird, soll umbenannt werden. Der Name der Tabelle in der Datenbank soll ebenfalls geändert werden. In diesem Zusammenhang wurde ebenfalls die Eigenschaft im entsprechenden DbContext angepasst. Bei der Erstellung der Migration wird folgende Meldung angezeigt:

An operation was scaffolded that may result in the loss of data. Please review the migration for accuracy.

Der generierte Code hat folgenden Aufbau:

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.DropForeignKey(
        name: "FK_Unterstuetzungen_Sponsorkategorien_SponsorkategorieId",
        schema: "Sponsoren",
        table: "Unterstuetzungen");

    migrationBuilder.DropTable(
        name: "Sponsorkategorien",
        schema: "Sponsoren");

    migrationBuilder.DropIndex(
        name: "IX_Unterstuetzungen_SponsorkategorieId",
        schema: "Sponsoren",
        table: "Unterstuetzungen");

    migrationBuilder.AddColumn<Guid>(
        name: "KategorieId",
        schema: "Sponsoren",
        table: "Unterstuetzungen",
        nullable: true);

    migrationBuilder.CreateTable(
        name: "Kategorien",
        schema: "Sponsoren",
        columns: table => new
        {
            Id = table.Column<Guid>(nullable: false),
            Code = table.Column<string>(maxLength: 15, nullable: true),
            Name = table.Column<string>(maxLength: 100, nullable: true),
            Rang = table.Column<int>(nullable: false),
            Beschreibung = table.Column<string>(maxLength: 1000, nullable: true)
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_Kategorien", x => x.Id);
        });

    migrationBuilder.CreateIndex(
        name: "IX_Unterstuetzungen_KategorieId",
        schema: "Sponsoren",
        table: "Unterstuetzungen",
        column: "KategorieId");

    migrationBuilder.AddForeignKey(
        name: "FK_Unterstuetzungen_Kategorien_KategorieId",
        schema: "Sponsoren",
        table: "Unterstuetzungen",
        column: "KategorieId",
        principalSchema: "Sponsoren",
        principalTable: "Kategorien",
        principalColumn: "Id",
        onDelete: ReferentialAction.Restrict);
}

Diese Migration führt zu Datenverlust, da die bestehende Tabelle gelöscht wird und eine neue angelegt. Die Daten sollen erhalten bleiben.

Abbildung zeigt den Inhalt der Tabelle, der verloren geht mit dem generierten Code der Migration.

Aktion

Die erstellte Migration lässt sich anpassen. Dazu wird der generierte Code entfernt und durch die Rename-Methode für Tabellen und Spalten ersetzt.

protected override void Up(MigrationBuilder migrationBuilder)
{
    migrationBuilder.RenameTable("Sponsorkategorien",
        "Sponsoren",
        "Kategorien",
        "Sponsoren");

    migrationBuilder.RenameColumn("SponsorkategorieId",
        "Unterstuetzungen",
        "KategorieId", 
        "Sponsoren");
}

Resultat

Beim Ausführen der Migration wird eine Umbenennung der Tabelle und der Fremdschlüssel-Spalte durchgeführt und so ein Datenverlust bzw. eine aufwendige Datenmigrationen vermieden.

Abbildung zeigt die umbenannte Tabelle mit Inhalt