Um recurso interessante que saiu com o Entity Framework 4.3 é o Code First Migrations. Este recurso permite que a estrutura do banco de dados evolua junto com o seu modelo de dados.

Por exemplo, ao criar uma entidade Município, o Migrations identifica esta alteração no modelo e gera um comando que cria a tabela na base de dados. Em seguida, ao adicionar ou alterar campos a essa entidade, o Migrations novamente identifica estas alterações e gera comandos que adicionam ou alteram as colunas na tabela do banco de dados. Isso vale para uma série de alterações como por exemplo, relacionamentos (foreign keys), campos obrigatórios, tamanho máximo para um campo, chaves primárias, etc. Ou seja, faz todo o trabalho sujo de manutenção da estrutura do banco de dados conforme o meu modelo criado com o EF Code First.

Pontos a destacar

  • Permite gerar script sql (.sql) para que o DBA execute este script em um ambiente específico;
  • Permite downgrade, ou seja, permite voltar a estrutura da base de dados até um ponto x na linha do tempo;
  • Permite estender algumas funcionalidades e comportamentos do “script”  gerado;
  • Permite alterar a seguencia de comandos script/código gerado para fazermos uma intervenção mais complexa na estrutura da base de dados;
  • Funciona com Sql Server/Sql Azure (não federado), mas entendo que pode ser estendido ou adaptado para outros bancos;

Exemplo

Código do modelo e do migrations

Estrutura criada no banco de dados

Passo a passo

A seguir demonstro alguns recursos do Entity Framework Code First Migrations de forma incremental.

Os fontes com a solução completa estão disponíveis no meu GitHub e requer o Entity Framework 4.3 ou superior.

1) Criando a primeira migração

1.1) Crio uma nova entidade e seus campos no meu modelo

Entidade Pais

1.2) Adiciono ela ao contexto do Entity Framework

Contexto do EF

1.3) Habilito um projeto separado a armazenar minhas migrações e configuro qual o contexto de EF que ele irá gerenciar.

Acessando o console

 

Habilitando um projeto de repositório para as migrações

1.4) Executo o comando de migração

Primeira "migração"

  • As informações de ProjectName é para o Migrations localizar a string de conexão com o banco de dados no qual ele irá avaliar para gerar a migração.
  • “Paises” é um nome qualquer usado para nomear as alterações que a migração irá aplicar.

1.5) Executo o comando de atualizar a base de dados

Atualizando a base de dados

  •  Comando executado: Update-Database -StartUpProjectName:”IntroducaoAoMigrations.BancoDeDados” -ProjectName:”IntroducaoAoMigrations.BancoDeDados” -verbose
    • No caso, o parâmetro “-verbose” é apenas para exibir o comando SQL que é executado no banco de dados no console.

2) Criando a segunda migração

2.1) Crio uma nova entidade e seus campos, no caso a de Estados.

Entidade Estado adicionada ao modelo

2.2) Adiciono ela ao contexto do Entity Framework

Atualizado o contexto do EF

2.3) Executo o comando de migração

Criando a migração das alterações de Estados

2.4) Executo o comando de atualizar a base de dados

Atualizando a base de dados

3) Fazendo o downgrade

Uma possibilidade do Migrations é desfazer alterações de estrutura na base de dados. Para isto, basta informar o parâmetro “-TargetMigration” no comando de Update-Database e informar para qual migração quer levar a base. Caso queira desfazer todas as migrações, basta informar zero (0) como o target.

Desfazendo migrações

4) Gerando um script sql

Outra possibilidade do Migrations é a partir das migrações gerar um script sql que irá atualizar a base de dados. Para isto, basta informar o parâmetro “-script” no comando de Update-Database.

Gerando script SQL

Referências

Fontes

Conclusão

Para quem utiliza o Entity Framework Code First, o Migrations é ótimo para gerenciar a estrutura do banco de dados sem grandes dificuldades. Estou utilizando ele em um projeto real e até o momento tem sido muito bom trabalhar com ele. Recomendo!

Até mais.

Rafael Leonhardt