Beim Umbenennen der Entität wird die Tabelle gelöscht und erstellt, anstatt sie nur umzubenennen.
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:
ZB builder.Entity<OriginalEntity>().ToTable("RenamedEntity");
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.
Benennen Sie die tatsächliche Entitätsklasse um.
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:
Entfernen Sie das .ToTable("RenamedEntity");
. Wenn der Tabellenname korrekt ist, sollte der konventionsbasierte Name mit dem aktuellen Namen übereinstimmen.
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:
.ToTable
mit dem aktuellen Tabellennamen hinzu.ToTable
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");
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:
ZB
builder.Entity<OriginalEntity>().ToTable("RenamedEntity");
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
undAddPrimaryKey
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.Benennen Sie die tatsächliche Entitätsklasse um.
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:Entfernen Sie das
.ToTable("RenamedEntity");
. Wenn der Tabellenname korrekt ist, sollte der konventionsbasierte Name mit dem aktuellen Namen übereinstimmen.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:
.ToTable
mit dem aktuellen Tabellennamen hinzu.ToTable
Weitere Informationen finden Sie in dieser Stapelüberlauffrage:
https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns