Novos comandos Code-First Migration

Olá pessoal, tudo bem? Espero que tenham gostado das novidades apresentadas no artigo Novidades no Entityframework 7, porque as novidades não param por ai :). Para quem já trabalha há algum tempo ou mesmo para os curiosos em estudar e mexer com Code-First, trabalhar com o Code-First Migration Commands não é nenhuma novidade e não tem nenhum bixo de sete cabeças :).

Muitos ainda tem o costume de trabalhar com o velho e famoso arquivo .edmx, ou por comodismo, ou por aversão mudanças ou por pura praticidade. Mas eu posso garantir para os aversos a mudanças: EXPERIMENTEM MUDAR!!! Uma vez migrado seu código para POCO/Code-First, o controle das suas classes de dominio será muito mais fácil, as mudanças serão mais controladas, a aplicação de padrões e conceitos do DDD como: Bounded Context, Context Map (temos de um artigo futuro) serão muito mais fáceis de serem aplicados, além de que não correremos o risco de atualizarmos o arquivo .edmx (câncer de de uma aplicação :D) e quebrar toda e qualquer customização e configuração que foi realizada para um determinado projeto. Outro ponto negativo – observado da ótica dos conceitos e práticas do DDD – que temos observado utilizando as classes mapeadas dentro de um arquivo .edmx, é a quantidade de classes anêmicas que temos (tema para um próximo artigo sobre :)), as quais são apenas representações do banco, dentro de sua aplicação e mais nada.

Bom, voltando ao assunto! A questão de se trabalhar com Code-First através dos comandos utilizados no console PM(Package Manager) dão ao desenvolvedor uma maior facilidade em alterar o que for necessário nas classes de dominio, flexibilidade em não sair do visual studio e visualizar as alterações e focar no código, 100% no código do negócio da aplicação. Antes de falarmos sobre a introdução dos novos comandos Migration para o EF 7, vou apresentar e explicar alguns dos comandos Migration mais utilizados no dia-a-dia do desenvolvimento de um projeto que utiliza EF 6.1.X.

Quando estamos de frente ao console PM, nos perguntamos:E agora? O que eu posso digitar? O que é aceito aqui? Quais comandos estão disponíveis e quais são os parâmetros que podemos utilizar? É isso que vou mostrar agora pra vocês.

Antes de mais nada, todo e qualquer comando que você utilize no console PM, é baseado em Powershell script, então existe um padrão a ser utilizado nos comandos. Quando tivermos dúvidas sobre algum comando, não tenha mais medo ;):

  1. Get-Help {nome do comando} – examples- O comando get-help utilizando o parâmetro -examples retorna exemplos de aplicações sobre o comando Migration desejado.
  2. Get-Help {nome do comando} -detailed- Já o parâmetro -detailed retorna a descrição do comando, uma sinopse e exemplos de aplicação, bem como os parâmetros e suas descrições.
  3. Get-Help {nome do comando} -full- O parâmetro* -full* retorna tudo o que o parâmetro -detailed retorna, mais informações técnicas sobre os parâmetros do comando.

Experimente executar o comando: PM> Get-Help Update-Database -detailed. Para os amantes do EF 6.1.x os comandos mais utilizados são:

- enable-migrations
- add-migrations - update-database - get-migrations

Enable-Migrations

Este comando funciona até a versão 6.1.x do Entityframework, ele é o responsável por habilitar o Migration em seu projeto e criar o arquivo Configuration.cs no projeto. No caso de não ser informado nenhum parâmetro, o comando criará uma pasta chamada Migration contendo o arquivo de configuração do Configuration.cs com as configurações padrão. Abaixo explicarei alguns dos parâmetros mais utilizados:

  • -ProjectName- Este parâmetro é usado para informar o nome do projeto que contem a sua classe de contexto (classe que herda de DbContext)

    PM> Enable-Migrations -ProjectName MyProject.Data.Domain

  • -EnableAutomaticMigrations- Este parâmetro configura para o valor true o atributo AutomaticMigrationsEnabled da classe Configuration que pode ser localizada no arquivo Configuration.cs

PM> Enable-Migrations -EnableAutomaticMigrations  

ou

PM> Enable-Migrations -Auto  
  • -Force- O comando enable-migration só pode ser executado uma única vez por DbContext, porém caso você precise sobreescrever as suas configurações, esse parâmetro pode ser utilizado para o mesmo DbContext.
PM> Enable-Migrations -Force  

Add-MigrationCom as mudanças que estão acontecendo com a chegada do EF7, alguns comandos Migrations deixaram de existir ou foram substituidos por outros, como é o caso do comando Enable-Migrations, que não existe mais.

Este comando é a chave para o cenário Migration. É através dele que qualquer alteração que for feita no seu contexto DbContext, mapeamento, nova classe de dominio que foi registrada, enfim, qualquer que seja a alteração, este é o comando que vai criar um arquivo .cs contendo todas as configurações relacionadas ao seu mapeamento de seu dominio. Abaixo explicarei alguns dos parâmetros mais utilizados:

  • -Name- Especifica o nome do arquivo .cs que será criado contendo as configurações realizadas no mapeamento do seu dominio.
PM> Add-Migration -Name MeuPrimeiroMigration  
  • -ProjectName- Informa o nome do projeto que contem o arquivo de configuração Configuration.cs, caso este parâmetro seja omitido o comando utilizará o projeto que estiver selecionado em sua solução para bsucar pelo arquivo Configuration.cs.
PM> Add-Migration -Name MeuPrimeiroMigration -ProjectName NomeDoProjeto  
  • -Force- Especifica que o arquivo de Migration será sobreescrito.
PM> Add-Migration -Name MeuMigration -Force  
  • -IgnoreChanges- Para casos em que você já tenha um mapeamento realizado e uma base de dados criada, este comando irá ignorar toda e qualquer alteração que foi realizada no seu modelo. A recomendação é que esse parâmetro seja utilizado para criar um arquivo inicial e vazio para habilitar o Migration para uma base de dados que já existe em seu cenário.
PM> Add-Migration -Name MeuMigrationInicial -IgnoreChanges  

Update-Database

Este comando executa o último arquivo de Migration que foi criado pelo comando Add-Migration. Caso nenhum arquivo de Migration ainda não tenha sido aplicado no banco de dados – essa validação é realizada pela comparação do Hash que é criado e inserido na tabela *__MigrationHistory *com o Hash gerado na execução do comando; esse Hash é gerado por meio do(s) arquivo(s) de Migration criados – todos os arquivos de Migration serão aplicados na base de dados, criando a base de dados, caso ela ainda não exista e todo o esquema do BD que foi informado nos mapeamentos do dominio. Abaixo explicarei alguns dos parâmetros mais utilizados:

  • -ProjectName- Esse parâmetro informa o nome do projeto que contem os arquivos de Migration. Caso o parâmetro seja omitido, será utilizado o projeto selecionado na solução.
PM> Update-Database -ProjectName MeuProjeto  
  • -TargetMigration- Utilizado para atualizar a base de dados baseado em outro arquivo de Migration. Normalmente é utilizado caso seja necessário realizar um procedimento de rollback no esquema do banco de dados. Este parâmetro necessita que seja informado qual o arquivo de Migration será utilizado.
PM> Update-Database -TargetMigration MeuArquivoEspecifico_Migration  
  • -Script- Este parâmetro informa ao comando Update-Database para não aplicar as alterações dos arquivos de Migration direto na base de dados. Com isso, o comando gera apenas um arquivo .sql contendo o script que pode ser utilizado em conjunto com o DBA de sua empresa, para ser aplicado em outra base de dados.
PM> Update-Database -Script  
  • -SourceMigration- Este parâmetro é utilizado apenas para geração de script. Este parâmetro só pode ser usado junto com o parâmetro -Script. Este parâmetro também pode ser utilizado em conjunto com -TargetMigration no caso de precisar gerar apenas um script de uma versão mais antiga dentre os seus arquivos de Migration.
PM> Update-Database -Script -SourceMigration MeuArquivoMigration  

ou

PM> Update-Database -Script -SourceMigration MeuArquivoMigration -TargetMigration MeuArquivoEspecifico_Migration  

Get-Migrations

Este comando retorna todos os arquivos de Migration que foram aplicados na base de dados.

Bom, até agora tudo foi tranquilo e acredito que já deve ser de conhecimento de muitos que utilizam o modo Code-First há tempos. Mas, como falamos no inicio do artigo, alguns comandos foram removidos e outros substituidos na versão do EF7.Um outro ponto bastante interessante com as novidades que virão com a nova versão do Entityframework é que para ter acesso aos comandos, não basta apenas instalar uma das versões do EF, será preciso instalar um novo assembly na sua aplicação:

PM> Install-Package EntityFramework.Commands  

Isso mesmo! Com a instalação desse novo assembly, você será capaz de utilizar não só a versão do command-line mas também utilizar esses comandos por meio de métodos das classe Database encontrada na classe DbContext.

Segue a lista abaixo:

  • Enable-Migrations – Este comando não existe mais e foi simplificado para utilizar apenas o comando Add-Migration. Isso mesmo, utilizando o comando Add-Migration e informando o nome do arquivo, o seu projeto já está habilitado para utilizar os comandos de Migration.
  • Update-Database – Foi substituido pelo comando Apply-Migration. Agora qualquer aplicação dos arquivos de Migration que você precise aplicar em seu banco de dados ou extração de script, será por meio deste comando.
  • *Script-Migration *– Commando para geração de Scripts que serão utilizados para aplicação em base de dados.
  • Reverse-Engineer – Com este comando será possível você trabalhar engenharia reversa numa base de dados que já existe em seu projeto, mas com a vantagem de todos os relacionamentos de sua base, tornarem-se classe POCO, além da criação da classe de contexto com toda a configuração necessária. Atenção: este comando necessita que seja informado uma string de conexão por meio do parâmetro -ConnectionString:"[SuaStringConexão]"
  • Remove-Migration – Remove a aplicação de um Migration especifico.

Bom pessoal, de fato a Microsoft e o time que mantem e evolui o Entityframework está trabalhando em muitas alterações não só a nível de redesign das classes da própria estrutura do EF, mas também nas formas de utilizarmos o Migration, até porque tudo no EF7 será via Code-First e os Migration Commands serão muito uteis e facilitarão muito nosso dia a dia. Outro aviso que gostaria de deixar claro aqui, é que Migration é para ser utilizado em ambiente de DEV e não de Produção – há quem seja aventureiro que e utilize o Migration em ambiente de PROD, contudo não é recomendado pois pode haver perda de Database Schema e Dados(o que será muito crítico para a sua aplicação, projeto e empresa :)).

Espero que tenham gostado das novidades, tenham uma ótima semana e até o próximo artigo 🙂

Referências:

Github-Entityframework

Comments