Pomelo.entityframeworkcore.mysql: Renommer l'entité

CrĂ©Ă© le 20 fĂ©vr. 2020  Â·  3Commentaires  Â·  Source: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

Renommer l'entité supprimera et créera la table au lieu de la renommer uniquement.

closed-question type-question

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 :

  1. À l'aide du nom d'entitĂ© d' origine , dĂ©finissez le nom de la table sur la nouvelle valeur. Essayez de vous assurer que ce nouveau nom est correct pour la nouvelle entitĂ©, ou vous pourriez vous retrouver avec une migration supplĂ©mentaire.

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

  1. 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.

  2. Renommez la classe d'entité réelle.

  3. 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 :

  1. 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.

  2. 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:

  1. Renommez l'entité et ajoutez le .ToTable avec le nom de la table actuelle
  2. Générer une migration.
  3. Supprimer l'attribut .ToTable
  4. Générez une autre migration.

Pour plus d'informations, consultez cette question de débordement de pile :

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

Tous les 3 commentaires

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 :

  1. À l'aide du nom d'entitĂ© d' origine , dĂ©finissez le nom de la table sur la nouvelle valeur. Essayez de vous assurer que ce nouveau nom est correct pour la nouvelle entitĂ©, ou vous pourriez vous retrouver avec une migration supplĂ©mentaire.

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

  1. 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.

  2. Renommez la classe d'entité réelle.

  3. 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 :

  1. 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.

  2. 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:

  1. Renommez l'entité et ajoutez le .ToTable avec le nom de la table actuelle
  2. Générer une migration.
  3. Supprimer l'attribut .ToTable
  4. Générez une autre migration.

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");
Cette page vous a été utile?
0 / 5 - 0 notes