EF Core - Usando alguns recursos do Migrations


 Neste artigo veremos como usar os alguns recursos do Migrations do EF Core.


Usando o recurso Migrations do Entity Framework podemos realizar alterações em nosso modelo de entidades e ter a atualização automática do banco de dados refletindo essas mudanças.

 

Através do Code First podemos gerar de forma automática o nosso modelo de dados a partir do modelo de entidades e com o Migrations podemos gerar atualizações no banco de dados refletindo as alterações porventura feitas  no modelo de entidades.

Dessa forma o Migrations pode ser usado com o Code First para automatizar de vez o processo de geração e atualização do modelo de dados com base no modelo de entidades onde o Migrations vai manter o modelo de dados gerado via Code First sempre atualizado com as classes do modelo de entidades.

A seguir eu vou apresentar um resumo dos principais recursos do Migrations.

1- O que é preciso para criar uma migração em seu projeto com EF Core ?

A primeira coisa a fazer é instalar o pacote NugetMicrosoft. EntityFrameworkCore.Design

Este pacote contém toda a lógica de tempo de design do Entity Framework Core. Nele esta o código que todas as ferramentas (cmdlets PMC como Add-Migration, dotnet ef e ef.exe) invocam. 

Ele é responsável por gerar as migrações (scripts, arquivos de migrações, etc.) com base em um modelo de entidades.

Dessa forma, se você pretende usar o Migrations ou fazer a engenharia reversa, você tem que instalar este pacote.

Para poder executar os comandos de geração da migração e fazer a aplicação da migração no banco de dados temos que instalar o pacote Nuget : Microsoft.EntityFrameworkCore.Tools

Este pacote é um super conjunto de comandos do PowerShell (Add-Migration, Remove-Migration, Update-Database, etc) em sua aplicação que ajudam a realizar as tarefas de desenvolvimento em tempo de projeto. Esses comandos podem ser aplicados usando a janela Package Manager Console no VIsual Studio.

A outra opção é usar a ferramenta de linha de comando e instalar a ferramenta : dotnet ef

O dotnet ef pode ser instalado como uma ferramenta global ou local. A maioria dos desenvolvedores prefere instalar o dotnet ef como uma ferramenta global usando o seguinte comando: dotnet tool install --global dotnet-ef

Com isso você pode executar as migrações a partir de qualquer prompt de comandos.

2- Como criar uma migração usando o EF Core  ?

Para criar uma migração podemos usar os seguintes comandos:

  1. Na janela Package Manager Console -:   add-migration <nome_da_migracao>
     
  2. Em um prompt de comandos :  dotnet ef migrations add <nome_da_migracao>

Esses comandos irão gerar um arquivo contendo o script de migração que possui os comandos para criar as tabelas, colunas, índices, relacionamentos, etc.

 

O arquivo de script de migração é uma classe que herda da classe Migration e contém dois métodos:

  1. Up() - Que aplica os comandos

  2. Down() - Que desfaz os comandos

3- Como gerar um script de migração ?


A geração de um script de migração às vezes é necessária quando não temos acesso a estrutura do banco de dados na produção. Assim geramos o script e o DBA executa o script.

 

Para gerar o script de migração podemos usar o comando:

  1. Em um prompt de comandos :  dotnet ef migrations script -o PrimeiroScript.sql

Este comando vai gerar o arquivo PrimeiroScript.sql contendo todos os comandos SQL para criar as tabelas, propriedades, índices, relacionamentos a partir das entidades e configurações definidas no projeto.

 

4- Gerando um script de migração idempotente.


Os scripts SQL gerados na opção anterior só podem ser aplicados para alterar o esquema de uma migração para outra; é sua responsabilidade aplicar o script adequadamente e somente o banco de dados no estado de migração correto.


O EF Core também dá suporte à geração de scripts idempotentes , que verificam internamente quais migrações já foram aplicadas (por meio da tabela de histórico de migrações) e aplicam-se apenas às tabelas ausentes.

 

Isso será útil se você não souber exatamente qual é a última migração aplicada ao banco de dados ou se estiver implantando em vários bancos de dados que podem estar em uma migração diferente.

 

Para gerar um script idempotente usamos o comando:

  1. Em um prompt de comandos :  dotnet ef migrations script --idempotent

Este comando vai gerar um arquivo contendo os comandos SQL mas vai incluir validações para verificar se a migração já foi aplicada ou não.


5- Verificando se existem migrações pendentes

Podemos verificar se existem migrações pendentes em nosso projeto antes de enviar para produção.

Uma forma de fazer isso é incluir o seguinte código no arquivo Program.cs do seu projeto:

using System.Linq;
using Microsoft.EntityFrameworkCore;

private static void Main(string[] args)
{

   using (var ctx = new ApplicationDbContext())   
   {

      var pendencias = ctx.Database.GetPendingMigrations().Any();

      if(pendencias)
      {
          //sua lógica
      }
  }
}

No código acima usamos o método GetPendingMigrations() que obtém todas as migrações definidas no assembly, mas não aplicadas ao banco de dados de destino.

A seguir verificamos se existem pendências e aplica a nossa lógica de tratamento para o caso.

Nota para aplicar migrações pendentes você pode criar um método de extensão usando uma instância do serviço do contexto do EF Core da aplicação. Exemplo:

public static class DatabaseManagementService
{
    public static void MigrationInitialization(this IApplicationBuilder app)
    {
        using (var serviceScope = app.ApplicationServices.CreateScope())
        {
            var serviceDb  = serviceScope.ServiceProvider
                                   .GetService<AppDbContext>();
                            

            serviceDb.Database.Migrate();
        }
    }
}

A seguir basta chamar o método MigrationInitialization() passando uma instância de IApplicationBuilder.

E estamos conversados...

"Portanto, lembrai-vos de que vós noutro tempo éreis gentios na carne, e chamados incircuncisão pelos que na carne se chamam circuncisão feita pela mão dos homens;
Que naquele tempo estáveis sem Cristo, separados da comunidade de Israel, e estranhos às alianças da promessa, não tendo esperança, e sem Deus no mundo."
Efésios 2:11,12

Referências:


José Carlos Macoratti