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

    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:

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

    PM> Enable-Migrations -EnableAutomaticMigrations
    

    ou

    PM> Enable-Migrations -Auto
    
    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:

    PM> Add-Migration -Name MeuPrimeiroMigration
    
    PM> Add-Migration -Name MeuPrimeiroMigration -ProjectName NomeDoProjeto
    
    PM> Add-Migration -Name MeuMigration -Force
    
    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:

    PM> Update-Database -ProjectName MeuProjeto
    
    PM> Update-Database -TargetMigration MeuArquivoEspecifico_Migration
    
    PM> Update-Database -Script
    
    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:

    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

    EFEF7Entityframework
    José Roberto Araújo's' avatar