La entidad de cambio de nombre se eliminará y creará la tabla en lugar de cambiarle el nombre únicamente.
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:
Por ejemplo, builder.Entity<OriginalEntity>().ToTable("RenamedEntity");
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.
Cambie el nombre de la clase de entidad real.
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:
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.
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:
.ToTable
con el nombre de la tabla actual.ToTable
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");
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:
Por ejemplo,
builder.Entity<OriginalEntity>().ToTable("RenamedEntity");
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
yAddPrimaryKey
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.Cambie el nombre de la clase de entidad real.
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: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.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:
.ToTable
con el nombre de la tabla actual.ToTable
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