Renommer l'entité supprimera et créera la table au lieu de la renommer uniquement.
Il s'agit d'une limitation inhérente à EF, pas directement à Pomelo. EF ne peut normalement pas faire la distinction entre une suppression/création de table et un renommage.
L'astuce pour lui dire qu'il s'agit d'un renommage est de définir le nom de la table manuellement, soit via un attribut sur la classe d'entité, soit via l'API fluide OnModelCreating.
La séquence va comme :
Par exemple builder.Entity<OriginalEntity>().ToTable("RenamedEntity");
Générer une migration. Cela créera la migration de table de renommage correcte pour l'entité.
Vérifiez que cette migration est correcte. Si vous utilisez Pomelo 2.2.6, vérifiez les entrées migrationBuilder.DropPrimaryKey
et AddPrimaryKey
et supprimez-les, car elles ne sont pas nécessaires pour MySQL et causeront des problÚmes de génération de scripts SQL idempotents. Ceci est corrigé en 3.1.
Renommez la classe d'entité réelle.
Générez une autre migration pour mettre à jour l'instantané du modÚle avec les nouveaux noms d'entité.
Si vous souhaitez ensuite supprimer le .ToTable("RenamedEntity");
pour revenir à un nom de table basé sur des conventions :
Supprimez les .ToTable("RenamedEntity");
. Si le nom de la table est correct, le nom basĂ© sur la convention doit ĂȘtre le mĂȘme que le nom actuel.
Générez une migration finale pour vérifier que la table n'est pas renommée à nouveau. Si c'était le cas, annulez toutes les étapes, corrigez le nom et recommencez. Si la migration était vide, vous pouvez l'annuler.
Je ne l'ai pas encore testé, mais vous pouvez probablement le faire dans l'ordre inverse. C'EST à DIRE:
.ToTable
avec le nom de la table actuelle.ToTable
Pour plus d'informations, consultez cette question de débordement de pile :
https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns
Fondamentalement, il existe des heuristiques implémentées, qui peuvent détecter un changement de nom de table dans _certains_ cas.
Mais renommer est l'une de ces opĂ©rations, oĂč vous voulez absolument vĂ©rifier le code de migration gĂ©nĂ©rĂ© par la suite et changer les appels DropTable
et CreateTable
en RenameTable
si nécessaire.
EF Core a une table de renommage tout comme ces migrations générées automatiquement.
migrationBuilder.DropPrimaryKey(
name: "PK_LogFieldsConfiguration",
table: "LogFieldsConfiguration");
migrationBuilder.RenameTable(
name: "LogFieldsConfiguration",
newName: "LogFieldsConfigurations");
migrationBuilder.AddPrimaryKey(
name: "PK_LogFieldsConfigurations",
table: "LogFieldsConfigurations",
column: "Id");
Commentaire le plus utile
Il s'agit d'une limitation inhérente à EF, pas directement à Pomelo. EF ne peut normalement pas faire la distinction entre une suppression/création de table et un renommage.
L'astuce pour lui dire qu'il s'agit d'un renommage est de définir le nom de la table manuellement, soit via un attribut sur la classe d'entité, soit via l'API fluide OnModelCreating.
La séquence va comme :
Par exemple
builder.Entity<OriginalEntity>().ToTable("RenamedEntity");
Générer une migration. Cela créera la migration de table de renommage correcte pour l'entité.
Vérifiez que cette migration est correcte. Si vous utilisez Pomelo 2.2.6, vérifiez les entrées
migrationBuilder.DropPrimaryKey
etAddPrimaryKey
et supprimez-les, car elles ne sont pas nécessaires pour MySQL et causeront des problÚmes de génération de scripts SQL idempotents. Ceci est corrigé en 3.1.Renommez la classe d'entité réelle.
Générez une autre migration pour mettre à jour l'instantané du modÚle avec les nouveaux noms d'entité.
Si vous souhaitez ensuite supprimer le
.ToTable("RenamedEntity");
pour revenir à un nom de table basé sur des conventions :Supprimez les
.ToTable("RenamedEntity");
. Si le nom de la table est correct, le nom basĂ© sur la convention doit ĂȘtre le mĂȘme que le nom actuel.GĂ©nĂ©rez une migration finale pour vĂ©rifier que la table n'est pas renommĂ©e Ă nouveau. Si c'Ă©tait le cas, annulez toutes les Ă©tapes, corrigez le nom et recommencez. Si la migration Ă©tait vide, vous pouvez l'annuler.
Je ne l'ai pas encore testé, mais vous pouvez probablement le faire dans l'ordre inverse. C'EST à DIRE:
.ToTable
avec le nom de la table actuelle.ToTable
Pour plus d'informations, consultez cette question de débordement de pile :
https://stackoverflow.com/questions/13296996/entity-framework-migrations-renaming-tables-and-columns