Pomelo.entityframeworkcore.mysql: Cambiar el nombre de la entidad

Creado en 20 feb. 2020  ·  3Comentarios  ·  Fuente: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

La entidad de cambio de nombre se eliminará y creará la tabla en lugar de cambiarle el nombre únicamente.

closed-question type-question

Comentario más útil

Esta es una limitación inherente de EF, no directamente de Pomelo. EF normalmente no puede distinguir entre colocar / crear una tabla y un cambio de nombre.

El truco para decirle que es un cambio de nombre es establecer el nombre de la tabla manualmente, ya sea a través de un atributo en la clase de entidad o mediante la API fluida OnModelCreating.

La secuencia es la siguiente:

  1. Con el nombre de la entidad original , establezca el nombre de la tabla en el nuevo valor. Intente asegurarse de que este nuevo nombre sea correcto para la nueva entidad, o puede terminar con una migración adicional.

Por ejemplo, builder.Entity<OriginalEntity>().ToTable("RenamedEntity");

  1. Genera una migración. Esto creará la migración de tabla de cambio de nombre correcta para la entidad.
    Verifique que esta migración sea correcta. Si está utilizando Pomelo 2.2.6, verifique las entradas migrationBuilder.DropPrimaryKey y AddPrimaryKey y elimínelas, ya que no son necesarias para MySQL y causarán problemas al generar scripts SQL idempotentes. Esto se corrige en 3.1.

  2. Cambie el nombre de la clase de entidad real.

  3. Genere otra migración para actualizar la instantánea del modelo con los nuevos nombres de entidad.

Si luego desea eliminar .ToTable("RenamedEntity"); para volver a la nomenclatura de tablas basada en convenciones:

  1. Quite el .ToTable("RenamedEntity"); . Si obtuvo el nombre de la tabla correcto, el nombre basado en la convención debería ser el mismo que el nombre actual.

  2. Genere una migración final para verificar que no se vuelva a cambiar el nombre de la tabla. Si fue así, revierta todos los pasos, corrija el nombre y vuelva a hacer. Si la migración estaba vacía, puede revertirla.

Todavía tengo que probarlo, pero probablemente puedas hacerlo en el orden inverso a. ES DECIR:

  1. Cambie el nombre de la entidad y agregue .ToTable con el nombre de la tabla actual
  2. Genera una migración.
  3. Eliminar el atributo .ToTable
  4. Genere otra migración.

Para obtener más información, consulte esta pregunta de desbordamiento de pila:

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

Todos 3 comentarios

Esta es una limitación inherente de EF, no directamente de Pomelo. EF normalmente no puede distinguir entre colocar / crear una tabla y un cambio de nombre.

El truco para decirle que es un cambio de nombre es establecer el nombre de la tabla manualmente, ya sea a través de un atributo en la clase de entidad o mediante la API fluida OnModelCreating.

La secuencia es la siguiente:

  1. Con el nombre de la entidad original , establezca el nombre de la tabla en el nuevo valor. Intente asegurarse de que este nuevo nombre sea correcto para la nueva entidad, o puede terminar con una migración adicional.

Por ejemplo, builder.Entity<OriginalEntity>().ToTable("RenamedEntity");

  1. Genera una migración. Esto creará la migración de tabla de cambio de nombre correcta para la entidad.
    Verifique que esta migración sea correcta. Si está utilizando Pomelo 2.2.6, verifique las entradas migrationBuilder.DropPrimaryKey y AddPrimaryKey y elimínelas, ya que no son necesarias para MySQL y causarán problemas al generar scripts SQL idempotentes. Esto se corrige en 3.1.

  2. Cambie el nombre de la clase de entidad real.

  3. Genere otra migración para actualizar la instantánea del modelo con los nuevos nombres de entidad.

Si luego desea eliminar .ToTable("RenamedEntity"); para volver a la nomenclatura de tablas basada en convenciones:

  1. Quite el .ToTable("RenamedEntity"); . Si obtuvo el nombre de la tabla correcto, el nombre basado en la convención debería ser el mismo que el nombre actual.

  2. Genere una migración final para verificar que no se vuelva a cambiar el nombre de la tabla. Si fue así, revierta todos los pasos, corrija el nombre y vuelva a hacer. Si la migración estaba vacía, puede revertirla.

Todavía tengo que probarlo, pero probablemente puedas hacerlo en el orden inverso a. ES DECIR:

  1. Cambie el nombre de la entidad y agregue .ToTable con el nombre de la tabla actual
  2. Genera una migración.
  3. Eliminar el atributo .ToTable
  4. Genere otra migración.

Para obtener más información, consulte esta pregunta de desbordamiento de pila:

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

Básicamente, existen heurísticas implementadas, que pueden detectar un cambio de nombre de tabla en _algunos_ casos.

Pero el cambio de nombre es una de esas operaciones, en las que definitivamente desea verificar el código de migración generado después y cambiar las llamadas DropTable y CreateTable a RenameTable cuando sea necesario.

EF Core tiene una tabla de cambio de nombre al igual que estas migraciones generadas automáticamente.

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

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

        migrationBuilder.AddPrimaryKey(
            name: "PK_LogFieldsConfigurations",
            table: "LogFieldsConfigurations",
            column: "Id");
¿Fue útil esta página
0 / 5 - 0 calificaciones