Pomelo.entityframeworkcore.mysql: Renomeando Entidade

Criado em 20 fev. 2020  ·  3Comentários  ·  Fonte: PomeloFoundation/Pomelo.EntityFrameworkCore.MySql

A renomeação da entidade eliminará e criará a tabela em vez de renomeá-la apenas.

closed-question type-question

Comentários muito úteis

Esta é uma limitação inerente da EF, não diretamente do Pomelo. EF normalmente não pode distinguir entre uma queda / criação de tabela e uma renomeação.

O truque para dizer que é uma renomeação é definir o nome da tabela manualmente, por meio de um atributo na classe de entidade ou por meio da API fluente OnModelCreating.

A sequência é assim:

  1. Usando o nome da entidade original , defina o nome da tabela com o novo valor. Tente se certificar de que este novo nome está correto para a nova entidade, ou você pode acabar com uma migração adicional.

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

  1. Gere uma migração. Isso criará a migração de tabela de renomeação correta para a entidade.
    Verifique se esta migração está correta. Se você estiver usando o Pomelo 2.2.6, verifique as entradas migrationBuilder.DropPrimaryKey e AddPrimaryKey e exclua-as, uma vez que elas não são necessárias para o MySQL e causarão problemas com a geração de scripts SQL idempotentes. Isso foi corrigido em 3.1.

  2. Renomeie a classe de entidade real.

  3. Gere outra migração para atualizar o instantâneo do modelo com os novos nomes de entidade.

Se você quiser remover .ToTable("RenamedEntity"); para voltar à nomenclatura de tabela baseada em convenção:

  1. Remova o .ToTable("RenamedEntity"); . Se você obteve o nome da tabela correto, o nome baseado na convenção deve ser igual ao nome atual.

  2. Gere uma migração final para verificar se a tabela não foi renomeada novamente. Se foi, reverta todas as etapas, corrija o nome e refaça. Se a migração estava vazia, você pode revertê-la.

Ainda estou para testar, mas você provavelmente pode fazer isso na ordem inversa para. IE:

  1. Renomeie a entidade e adicione .ToTable com o nome da tabela atual
  2. Gere uma migração.
  3. Remova o atributo .ToTable
  4. Gere outra migração.

Para obter mais informações, consulte esta questão sobre estouro de pilha:

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

Todos 3 comentários

Esta é uma limitação inerente da EF, não diretamente do Pomelo. EF normalmente não pode distinguir entre uma queda / criação de tabela e uma renomeação.

O truque para dizer que é uma renomeação é definir o nome da tabela manualmente, por meio de um atributo na classe de entidade ou por meio da API fluente OnModelCreating.

A sequência é assim:

  1. Usando o nome da entidade original , defina o nome da tabela com o novo valor. Tente se certificar de que este novo nome está correto para a nova entidade, ou você pode acabar com uma migração adicional.

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

  1. Gere uma migração. Isso criará a migração de tabela de renomeação correta para a entidade.
    Verifique se esta migração está correta. Se você estiver usando o Pomelo 2.2.6, verifique as entradas migrationBuilder.DropPrimaryKey e AddPrimaryKey e exclua-as, uma vez que elas não são necessárias para o MySQL e causarão problemas com a geração de scripts SQL idempotentes. Isso foi corrigido em 3.1.

  2. Renomeie a classe de entidade real.

  3. Gere outra migração para atualizar o instantâneo do modelo com os novos nomes de entidade.

Se você quiser remover .ToTable("RenamedEntity"); para voltar à nomenclatura de tabela baseada em convenção:

  1. Remova o .ToTable("RenamedEntity"); . Se você obteve o nome da tabela correto, o nome baseado na convenção deve ser igual ao nome atual.

  2. Gere uma migração final para verificar se a tabela não foi renomeada novamente. Se foi, reverta todas as etapas, corrija o nome e refaça. Se a migração estava vazia, você pode revertê-la.

Ainda estou para testar, mas você provavelmente pode fazer isso na ordem inversa para. IE:

  1. Renomeie a entidade e adicione .ToTable com o nome da tabela atual
  2. Gere uma migração.
  3. Remova o atributo .ToTable
  4. Gere outra migração.

Para obter mais informações, consulte esta questão sobre estouro de pilha:

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

Basicamente, existem heurísticas implementadas, que podem detectar a renomeação de uma tabela em _alguns_ casos.

Mas renomear é uma daquelas operações, onde você definitivamente deseja verificar o código de migração gerado posteriormente e alterar as chamadas DropTable e CreateTable para RenameTable quando necessário.

EF Core mudou o nome da tabela, assim como essas migrações geradas automaticamente.

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

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

        migrationBuilder.AddPrimaryKey(
            name: "PK_LogFieldsConfigurations",
            table: "LogFieldsConfigurations",
            column: "Id");
Esta página foi útil?
0 / 5 - 0 avaliações