EF Core - Aplicando o Migrations em um projeto em camadas
 Neste artigo veremos como aplicar o Migrations em uma solução contendo vários projetos usando a ferramenda dotnet ef.


Quando usamos o EF Core na abordagem Code-First em um projeto ASP.NET Core MVC ou API que foi criado usando o template padrão. Podemos gerar os scripts de migração no projeto de inicialização.

 


Assim em um projeto ASP.NET Core os scripts são gerados na pasta Migrations do projeto Web.

 

Agora vamos supor que criamos um projeto ASP.NET Core MVC usando uma arquitetura em camadas (usando a abordagem da Clean Architecture) onde temos os seguintes projetos na solução:

Usando esta abordagem estamos separando as responsabilidades e na camada WebUI teremos o projeto Web que é a camada de interface. 

 

Na camada Infra.Data é que incluimos as referências ao Entity Framework Core e definimos o arquivo de contexto, aqui chamado de ApplicationDbContext, e implementamos os repositórios.

 

Assim ao aplicar o Migrations não queremos gerar a pasta Migrations nem os arquivos de migração no projeto WebUI que é projeto Web mas no projeto Infra.Data.

 

Para fazer isso podemos usar a ferramenta dotnet-ef.

 

Para verificar se a ferramenda esta instalada emita o seguinte comando :   dotnet ef

 

Se aparecer a imagem abaixo então a ferramenta esta instalada:

 

 

Para instalar a ferramenta no ambiente usamos o comando abaixo em um terminal de comandos :

dotnet tool install --global dotnet-ef

Para atualizar a ferramenta, caso ela esteja desatualizada usamos o seguinte comando:

dotnet tool update --global dotnet-ef

Considerando que as referências entre os projetos da solução esteja definidas corretamente e que o projeto de inicialização seja o projeto WebUI (definido com a opção Set as Startup Project) podemos iniciar.

 

Para gerar os arquivos de scripts e criar a pasta Migrations no projeto Infra.Data podemos usar o seguinte comando:

 

dotnet ef migrations add Initial --project YourDataAccessLibraryName -s YourWebProjectName -c YourDbContextClassName --verbose

 

onde:

 

- dotnet ef

- migrations add - comando para incluir uma nova migração

- initial - nome da migração

- YourDataAccessLibraryName - refere-se ao projeto Infra.Data

- YourWebProjectName - refere-se ao projeto WebUI

- YourDbContextClassName - refere-se ao nome do arquivo de contexto : ApplicationDbContext

- verbose - vai exibir os detalhes de execução do comando

 

Aplicando o comando para o nosso hipotético projeto temos:

 

dotnet ef migrations add Inicial --project Infra.Data -s WebUI -c ApplicationDbContext --verbose

 

Este comando vai gerar a pasta Migrations e os arquivos de scripts no projeto infra.Data.

 

Para aplicar o script gerado  use o comando:

 

dotnet ef database update Inicial --project Infra.Data -s WebUI -c ApplicationDbContext --verbose

Esses comandos irão criar e aplicar migrações, levando em consideração a estrutura em camadas do seu projeto ASP.NET Core.

E estamos conversados... 

"Porque os que são segundo a carne inclinam-se para as coisas da carne; mas os que são segundo o Espírito para as coisas do Espírito. Porque a inclinação da carne é morte; mas a inclinação do Espírito é vida e paz."
Romanos 8:5,6

Referências:


José Carlos Macoratti