Entity Framework Code First & Migrations Waldyr Felix ALM Ranger / Arquiteto de software waldyrfelix@2pc.com.br waldyrfelix.net/blog @WaldyrFelix
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
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
Convenções do Code First Chave Primária definida como “Id” ou “CategoryId” Relacionamento é inferido
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ó...
Demo: Primeiros passos 1. Criando as Entidades 2. Criando o DbContext 3. Gerenciando o contexto 4. Gerando o banco de dados
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
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
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
Relacionamentos 1..1 One-to-one
Relacionamentos 1..N One-to-many
Relacionamentos N..N Many-to-many
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
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
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>());
Demo: Configurando a inicialização 1. Criando inicialização da base 2. Customizando inicialização da base 3. Visualizando dados criados na base
PROBLEMA • Qualquer alteração envolve recriação inteira da base de dados • Inviável para usar em ambientes de produção
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
Começando com Migrations • Também é possível habilitar migrações automáticas, da seguinte forma PM> Enable-Migrations -EnableAutomaticMigrations
Demo habilitando Migrations 1. Habilitando Migrations em um modelo já existente 2. Visualizando alterações no projeto 3. Explorando o Migrations
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
Adicionando uma nova Migration • O formato do comando: – Comando + nome da migration PM> Add-Migration Add-Produto-DataDeCriacao
Aplicando atualizações no banco • Formato do comando: – Comando + parâmetros (opcional) PM> Update-Database
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
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
Fazendo Downgrade PM> Update-Database –TargetMigration:“Migration" –Force ou PM> Update-Database –TargetMigration: $InitialDatabase –Force
Demo downgrade do banco 1. Downgrade para uma migration 2. Restaurando a base para o estado original 3. Voltando para versão atual
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
Gerando Scripts PM> Update-Database -Script ou PM> Update-Database –Script –SourceMigration:$InitialDatabase
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
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>());
Duvidas? Blog: waldyrfelix.net/blog Twitter: @WaldyrFelix Email: waldyrfelix@2pc.com.br Obrigado

Entity Framework 5 & Migrations

  • 1.
    Entity Framework CodeFirst & 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 oCode 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 CodeFirst Chave Primária definida como “Id” ou “CategoryId” Relacionamento é inferido
  • 5.
    Instalando o CodeFirst 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 comFluent 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
  • 10.
  • 11.
  • 12.
  • 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çõesde 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çãoda 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 ainicialização 1. Criando inicialização da base 2. Customizando inicialização da base 3. Visualizando dados criados na base
  • 17.
    PROBLEMA • Qualquer alteraçãoenvolve 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 basicamentedois 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 novaMigration • O formato do comando: – Comando + nome da migration PM> Add-Migration Add-Produto-DataDeCriacao
  • 23.
    Aplicando atualizações nobanco • Formato do comando: – Comando + parâmetros (opcional) PM> Update-Database
  • 24.
    Demo comandos 1. Criandomais 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
  • 26.
    Fazendo Downgrade PM> Update-Database –TargetMigration:“Migration" –Force ou PM> Update-Database –TargetMigration: $InitialDatabase –Force
  • 27.
    Demo downgrade dobanco 1. Downgrade para uma migration 2. Restaurando a base para o estado original 3. Voltando para versão atual
  • 28.
    Gerando Scripts • Alémde aplicar automaticamente as alterações, é possível gerar o script dos mesmos • Para isso basta modificar o comando adicionando um novo parâmetro -Script
  • 29.
    Gerando Scripts PM> Update-Database -Script ou PM> Update-Database –Script –SourceMigration:$InitialDatabase
  • 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>());
  • 32.