Pomelo.entityframeworkcore.mysql: Entität umbenennen

Erstellt am 20. Feb. 2020  ·  3Kommentare  ·  Quelle: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

Beim Umbenennen der Entität wird die Tabelle gelöscht und erstellt, anstatt sie nur umzubenennen.

closed-question type-question

Hilfreichster Kommentar

Dies ist eine inhärente Einschränkung von EF, nicht direkt von Pomelo. EF kann normalerweise nicht zwischen einem Löschen/Erstellen einer Tabelle und einer Umbenennung unterscheiden.

Der Trick, um zu erkennen, dass es sich um eine Umbenennung handelt, besteht darin, den Tabellennamen manuell festzulegen, entweder über ein Attribut der Entitätsklasse oder über die OnModelCreating-Fluent-API.

Die Reihenfolge geht so:

  1. Legen Sie den Tabellennamen unter Verwendung des ursprünglichen Entitätsnamens auf den neuen Wert fest. Stellen Sie sicher, dass dieser neue Name für die neue Entität korrekt ist, da Sie sonst möglicherweise eine zusätzliche Migration durchführen.

ZB builder.Entity<OriginalEntity>().ToTable("RenamedEntity");

  1. Generieren Sie eine Migration. Dadurch wird die korrekte Umbenennungstabellenmigration für die Entität erstellt.
    Überprüfen Sie, ob diese Migration korrekt ist. Wenn Sie Pomelo 2.2.6 verwenden, überprüfen Sie die Einträge migrationBuilder.DropPrimaryKey und AddPrimaryKey und löschen Sie diese, da diese für MySQL nicht erforderlich sind und Probleme beim Generieren von idempotenten SQL-Skripten verursachen. Dies ist in 3.1 behoben.

  2. Benennen Sie die tatsächliche Entitätsklasse um.

  3. Generieren Sie eine weitere Migration, um den Modell-Snapshot mit den neuen Entitätsnamen zu aktualisieren.

Wenn Sie dann .ToTable("RenamedEntity"); entfernen möchten, um auf die konventionsbasierte Tabellenbenennung zurückzugreifen:

  1. Entfernen Sie das .ToTable("RenamedEntity"); . Wenn der Tabellenname korrekt ist, sollte der konventionsbasierte Name mit dem aktuellen Namen übereinstimmen.

  2. Generieren Sie eine abschließende Migration, um sicherzustellen, dass die Tabelle nicht erneut umbenannt wird. Wenn dies der Fall war, machen Sie alle Schritte rückgängig, korrigieren Sie den Namen und wiederholen Sie den Vorgang. Wenn die Migration leer war, können Sie sie rückgängig machen.

Ich muss es noch testen, aber Sie können dies wahrscheinlich in umgekehrter Reihenfolge tun. IE:

  1. Benennen Sie die Entität um und fügen Sie .ToTable mit dem aktuellen Tabellennamen hinzu
  2. Generieren Sie eine Migration.
  3. Entfernen Sie das Attribut .ToTable
  4. Generieren Sie eine weitere Migration.

Weitere Informationen finden Sie in dieser Stapelüberlauffrage:

https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns

Alle 3 Kommentare

Dies ist eine inhärente Einschränkung von EF, nicht direkt von Pomelo. EF kann normalerweise nicht zwischen einem Löschen/Erstellen einer Tabelle und einer Umbenennung unterscheiden.

Der Trick, um zu erkennen, dass es sich um eine Umbenennung handelt, besteht darin, den Tabellennamen manuell festzulegen, entweder über ein Attribut der Entitätsklasse oder über die OnModelCreating-Fluent-API.

Die Reihenfolge geht so:

  1. Legen Sie den Tabellennamen unter Verwendung des ursprünglichen Entitätsnamens auf den neuen Wert fest. Stellen Sie sicher, dass dieser neue Name für die neue Entität korrekt ist, da Sie sonst möglicherweise eine zusätzliche Migration durchführen.

ZB builder.Entity<OriginalEntity>().ToTable("RenamedEntity");

  1. Generieren Sie eine Migration. Dadurch wird die korrekte Umbenennungstabellenmigration für die Entität erstellt.
    Überprüfen Sie, ob diese Migration korrekt ist. Wenn Sie Pomelo 2.2.6 verwenden, überprüfen Sie die Einträge migrationBuilder.DropPrimaryKey und AddPrimaryKey und löschen Sie diese, da diese für MySQL nicht erforderlich sind und Probleme beim Generieren von idempotenten SQL-Skripten verursachen. Dies ist in 3.1 behoben.

  2. Benennen Sie die tatsächliche Entitätsklasse um.

  3. Generieren Sie eine weitere Migration, um den Modell-Snapshot mit den neuen Entitätsnamen zu aktualisieren.

Wenn Sie dann .ToTable("RenamedEntity"); entfernen möchten, um auf die konventionsbasierte Tabellenbenennung zurückzugreifen:

  1. Entfernen Sie das .ToTable("RenamedEntity"); . Wenn der Tabellenname korrekt ist, sollte der konventionsbasierte Name mit dem aktuellen Namen übereinstimmen.

  2. Generieren Sie eine abschließende Migration, um sicherzustellen, dass die Tabelle nicht erneut umbenannt wird. Wenn dies der Fall war, machen Sie alle Schritte rückgängig, korrigieren Sie den Namen und wiederholen Sie den Vorgang. Wenn die Migration leer war, können Sie sie rückgängig machen.

Ich muss es noch testen, aber Sie können dies wahrscheinlich in umgekehrter Reihenfolge tun. IE:

  1. Benennen Sie die Entität um und fügen Sie .ToTable mit dem aktuellen Tabellennamen hinzu
  2. Generieren Sie eine Migration.
  3. Entfernen Sie das Attribut .ToTable
  4. Generieren Sie eine weitere Migration.

Weitere Informationen finden Sie in dieser Stapelüberlauffrage:

https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns

Grundsätzlich sind Heuristiken implementiert, die in _manchen_ Fällen eine Tabellenumbenennung erkennen können.

Aber das Umbenennen ist einer dieser Vorgänge, bei denen Sie auf jeden Fall den generierten Migrationscode anschließend überprüfen und die DropTable und CreateTable Aufrufe bei Bedarf in RenameTable ändern möchten.

EF Core hat genau wie diese automatisch generierte Migration eine Umbenennungstabelle.

        migrationBuilder.DropPrimaryKey(
            name: "PK_LogFieldsConfiguration",
            table: "LogFieldsConfiguration");

        migrationBuilder.RenameTable(
            name: "LogFieldsConfiguration",
            newName: "LogFieldsConfigurations");

        migrationBuilder.AddPrimaryKey(
            name: "PK_LogFieldsConfigurations",
            table: "LogFieldsConfigurations",
            column: "Id");
War diese Seite hilfreich?
0 / 5 - 0 Bewertungen