Este documento discute Entity Framework Code First e Migrations. Ele explica como o Code First gera metadados a partir do código ao invés de XML, como funcionam as convenções do Code First e como configurar mapeamentos. Também mostra como habilitar e usar Migrations para aplicar alterações no banco de dados de forma incremental ao invés de recriar o banco inteiro.
1. Entity Framework Code First
&
Migrations
Waldyr Felix
ALM Ranger / Arquiteto de software
waldyrfelix@2pc.com.br
waldyrfelix.net/blog
@WaldyrFelix
2. Entity Framework 5
• Possibilidade de fazer tudo via código
• Mais produtividade
• Criação simplificada do DbContext
• Entidades limpas
• Geração automática do banco de dados
• Migrations
• Suporte a Enums
3. Como funciona o Code First
• Enquanto os outros métodos geram meta
dados em memória a partir do EDMX
– XML -> EntityType, AssociationType, EdmType, etc
• Code First gera os mesmos meta dados a
partir do código
– Classes -> EntityType, AssociationType, EdmType,
Database, etc
• Para isso o EF Code First usa Data Annotations
e/ou Fluent API
4. Convenções do Code First
Chave Primária definida como “Id”
ou “CategoryId”
Relacionamento é inferido
5. Instalando o Code First
1. Opção: via download no site
– http://msdn.com/data/ef
– Baixar e instalar
– Referenciar DLL no projeto
2. Opção: via NuGet
– PM> Install-Package EntityFramework
– E só...
6. Demo: Primeiros passos
1. Criando as Entidades
2. Criando o DbContext
3. Gerenciando o contexto
4. Gerando o banco de dados
7. Porque configurar mapeamentos?
• Quando as convenções não atendem aos
requisitos
– Acontece frequentemente por sinal
– Exemplo: string mapeado para nvarchar(max)
• Melhorar performance do banco
• Mudar tipos de dados que precisamos usar
8. Tipos de mapeamentos
Data Annotations Fluent API
• Usa atributos nas • Usa métodos
classes e propriedades encadeados fora das
• “Suja” o model com entidades
metadados • Necessário mais código
9. Demo: Configurando com Fluent API
1. Definindo tamanho máximo
2. Definindo campos obrigatórios (not null)
3. Definindo nome da tabela e colunas
4. Definindo tipo das colunas
5. Usando tipos complexos
13. Separando as configurações
• Quanto mais entidades tiver meu projeto
maior e mais confuso vai ficar meu
OnModelCreating
• Solução: Criar configurações específicas de
cada entidade em sua própria classe de
configuração
– Deve herdar de EntityTypeConfiguration
– As configurações passam para o construtor dessa
classe
14. Demo: Definindo configurações de
entidades
1. Criando classes de configuração
2. Realizando as configurações
3. Deixando as configurações visiveis ao EF
4. Configurando o relacionamento
15. Estratégias de criação da base
• É possivel modificar a forma como o EF cria o
banco de dados através da classe Database
• Os métodos possiveis são:
– DropCreateDatabaseAlways
– CreateDatabaseIfNotExists
– DropCreateDatabaseIfModelChanges
Database.SetInitializer(
new DropCreateDatabaseIfModelChanges<DemoContext>());
16. Demo: Configurando a inicialização
1. Criando inicialização da base
2. Customizando inicialização da base
3. Visualizando dados criados na base
17. PROBLEMA
• Qualquer alteração envolve recriação inteira
da base de dados
• Inviável para usar em ambientes de produção
18. Começando com Migrations
• Através do console do NuGet é possível
executar comandos para o EF para
habilitar o uso do Migrations
PM> Enable-Migrations
19. Começando com Migrations
• Também é possível habilitar migrações
automáticas, da seguinte forma
PM> Enable-Migrations -EnableAutomaticMigrations
20. Demo habilitando Migrations
1. Habilitando Migrations em um modelo já
existente
2. Visualizando alterações no projeto
3. Explorando o Migrations
21. Comandos
• Existem basicamente dois comandos que
podem ser usados:
– Add-Migration: que irá procurar pelas
modificações realizadas até então e adicionar uma
nova migration
– Update-Database: aplica as alterações pendentes
no banco de dados, a partir das migrations já
adicionadas ou infere as alterações
automaticamente
22. Adicionando uma nova Migration
• O formato do comando:
– Comando + nome da migration
PM> Add-Migration Add-Produto-DataDeCriacao
23. Aplicando atualizações no banco
• Formato do comando:
– Comando + parâmetros (opcional)
PM> Update-Database
24. Demo comandos
1. Criando mais uma propriedade no
modelo
2. Aplicar as alterações automaticamente
3. Criando uma nova Migration
4. Aplicando as alterações a partir dessa
nova Migration
25. Upgrade/Downgrade
• Upgrade é feito quase que automaticamente
• Mas é possível aplicar uma versão anterior
(downgrade)
• Para isso existem parâmetros especiais que
podem ser usados
– TargetMigration: indica para qual migration a
base deve atualizar
– Force: indica que mesmo havendo perda de dados
o comando deve ser executado
27. Demo downgrade do banco
1. Downgrade para uma migration
2. Restaurando a base para o estado original
3. Voltando para versão atual
28. Gerando Scripts
• Além de aplicar automaticamente as
alterações, é possível gerar o script dos
mesmos
• Para isso basta modificar o comando
adicionando um novo parâmetro -Script
30. Demo gerando scripts
1. Gerando um script com todas as alterações
de migração
2. Gerando um script específico para uma
versão
31. Automatizando a migração
• É possível automatizar o upgrade da aplicação
com migrations
• Para isso usamos o esquema de inicialização
da base
Database.SetInitializer(
new MigrateDatabaseToLatestVersion
<Context, Configuration>());