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 Nuget : Microsoft. 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:
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:
Up() - Que aplica os comandos
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:
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:
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(); |
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: