Esta semana, a equipe de dados
lançou a CTP5
(em Inglês) da biblioteca Entity Framework Code-First (Código-Primeiro ou Codificação Antecipada). A
opção Code-First ou Desenvolvimento Antecipado de Código do EF
permite um fluxo de trabalho de desenvolvimento de código extremamente
suave para trabalhar com dados. Esta opção de desenvolvimento te
permite:
- Desenvolver sem ter que abrir um designer ou definir um arquivo de mapeamento XML
- Definir objetos do modelo, simplesmente escrevendo "classes padrão" do .NET, sem a necessidade de classes base
- Usar uma abordagem de "convenção sobre configuração", que permite a persistência de dados sem configurar nada explicitamente
- Opcionalmente,
substituir a persistência baseada em convenção passando a usar uma API
de código fluente para personalizar completamente o mapeamento da
persistência
Sou um grande fã da abordagem Code-First do EF, e escrevi vários posts sobre ela neste verão:
O
lançamento de hoje da nova CTP5 entrega diversas melhorias agradáveis
que incrementam a CTP4, e será a última versão de amostra antes da
versão final. Nós lançaremos a versão final da biblioteca EF Code
First no primeiro trimestre do próximo ano (1º trimestre de 2011). Ela
funciona com todos os tipos de aplicação .NET (incluindo projetos
ASP.NET Web Forms e ASP.NET MVC).
Instalando a biblioteca EF Code First
Você pode instalar e usar a EF Code First CTP5 usando uma de duas maneiras:
Abordagem 1) Fazer o download e executar um programa de instalação. Uma vez instalada, você pode fazer referência ao assembly EntityFramework.dll dentro de seus projetos.
ou:
Abordagem 2) Usando o Gerenciador de Pacotes NuGet
dentro do Visual Studio para fazer o download e instalar a EF Code
First dentro de um projeto. Para fazer isso, basta abrir o Console do
Gerenciador de Pacotes do NuGet dentro do Visual Studio (View->Other
Windows->Package Manager Console) e digitar "Install-Package
EFCodeFirst":
Ao
digitar "Install-Package EFCodeFirst" dentro do Console do Gerenciador
de Pacotes, o NuGet fará o download do pacote da EF Code
First, e adicionará a biblioteca dentro do seu projeto atual:
Fazendo isso, será adicionada automaticamente uma referência para o assembly EntityFramework.dll no seu projeto:
O
NuGet permite que você tenha a EF Code First configurada e pronta para
uso em poucos segundos. Quando a versão final da EF Code First for
lançada, você também será capaz de digitar somente "Update-Package
EFCodeFirst" para atualizar seus projetos existentes para usar a versão
final.
Assembly e Namespace da EF Code First
O lançamento da EF Code First CTP5 tem um nome de assembly atualizado e novo namespace .NET:
- Nome do Assembly: EntityFramework.dll
- Namespace: System.Data.Entity
Estes nomes correspondem ao que pretendemos utilizar na versão final da biblioteca.
Novas Melhorias Legais da CTP5
O lançamento da nova CTP5 da EF Code First contém várias boas melhorias e aperfeiçoamentos. Alguns dos destaques incluem:
- Melhor suporte para bancos de dados existentes
- Suporte nativo para Validação no nível do modelo e para DataAnnotation
- Melhorias para a Fluent API
- Suporte a Convenções Plugáveis
- Nova API para controle de alterações/mudanças (Change Tracking API)
- Melhor Resolução de Conflitos de Concorrência
- Suporte a Comandos/Pesquisas SQL puras (Raw)
O resto deste post contém alguns detalhes sobre algumas das alterações acima.
Melhor Suporte para Bancos de Dados Existentes
A
EF Code First torna realmente fácil criar camadas do modelo que
trabalham com bancos de dados existentes. A CTP5 inclui alguns
refinamentos que simplificam ainda mais o fluxo de trabalho do
desenvolvedor para este cenário.
A seguir estão os passos para usar a EF Code First para criar uma camada de modelo para o banco de dados de exemplo Northwind:
Passo 1: Criar as Classes do Modelo e uma classe DbContext
A
seguir está todo o código necessário para implementar uma camada de
modelo simples usando a EF Code First que usa o banco de dados Northwind:
A
EF Code First permite a utilização de "POCO" - Objetos padrão da CLR -
para representar as entidades dentro de um banco de dados. Isso
significa que você não precisa derivar classes do modelo a partir
de uma classe base, nem implementar nenhuma interface ou atributos de
persistência de dados neles. Isso permite que as classes do modelo
sejam mantidas limpas, facilmente testáveis, e "ignorantes quanto à
persistência". As classes Product e Category acima são exemplos de
classes POCO do modelo.
A EF Code First permite que você conecte
facilmente suas classes POCO do modelo em um banco de dados através da
criação de uma classe "DbContext" que expõe propriedades públicas que
mapeiam para tabelas dentro de um banco de dados. A classe Northwind
acima ilustra como isso pode ser feito. Ela está mapeando nossas
classes Product e Category para as tabelas "Products" e "Categories" no
banco de dados. As propriedades dentro das classes Product e Category
por sua vez mapeiam para colunas nas tabelas Products e Categories - e
cada instância de um objeto Product/Category mapeia para uma linha
dentro das tabelas.
O código acima é todo o código necessário
para criar nosso modelo e camada de acesso a dados! CTPs anteriores da
EF Code First exigiam um passo adicional para funcionarem em bancos de
dados existentes (uma chamada para
Database.Initializer<Northwind>(null) para que a EF Code First não
criasse o banco de dados) - este passo não é mais necessário com o
lançamento da CTP5.
Passo 2: Configurar a String de Conexão do Banco de Dados
Nós
escrevemos todo o código que precisamos escrever para definir nossa
camada do modelo. Nosso último passo antes de usá-la será configurar
uma string de conexão que conecta a mesma em nosso banco de dados. Para
isso vamos acrescentar uma string de conexão "Northwind" em nosso
arquivo web.config (ou app.config para aplicações cliente) assim:
<connectionStrings>
<add name="Northwind"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\northwind.mdf;User Instance=true"
providerName="System.Data.SqlClient" />
</connectionStrings>
A
EF "code first" usa uma convenção onde classes DbContext por padrão
buscam por uma string de conexão que tenha o mesmo nome da classe de
contexto. Devido nossa classe DbContext ser chamada "Northwind", ela
por padrão procurará por uma string de conexão "Northwind" para usar. Acima nossa string de conexão Northwind é configurada para usar um banco
de dados SQL Express local (armazenado dentro do diretório \App_Data
do nosso projeto). Você pode, alternativamente, apontar para um SQL
Server remoto.
Passo 3: Usando nossa Camada do Modelo Northwind
Agora
podemos facilmente consultar e atualizar nosso banco de dados usando a
camada de modelo fortemente tipada que acabamos de construir com a EF
Code First.
O exemplo de código a seguir demonstra como usar LINQ
para consultar os produtos dentro de uma categoria de produtos
específica. Esta consulta devolve uma sequência de objetos produto
fortemente tipados que coincidem com os critérios da pesquisa:
O
exemplo de código a seguir demonstra como podemos recuperar um objeto
produto específico, atualizar duas de suas propriedades e, em seguida
salvar as alterações de volta no banco de dados:
A
EF Code First trata de todo o monitoramento de alterações e da
persistência de dados para nós, e permite-nos concentrar em nossa
aplicação e lógica do negócio ao invés de nos preocuparmos com a ligação
de acesso aos dados.
Validação Nativa para o Modelo
A
EF Code First permite que você utilize qualquer abordagem de validação
que você quiser quando estiver implementando regras de negócio em sua
camada do modelo. Isto permite uma grande flexibilidade e poder.
Começando
com o lançamento da CTP5 desta semana, a EF Code First também inclui
suporte nativo para validação com DataAnnotation e IValidatorObject no
.NET 4. Isso permite que você facilmente implemente regras de validação
nos seus modelos, e que essas regras sejam automaticamente aplicadas
pela EF Code First sempre que você salvar sua camada do modelo. Ela
fornece uma maneira muito conveniente "fora da caixa" para possibilitar a
validação de dados em suas aplicações.
Aplicando DataAnnotations em nosso Modelo Northwind
O
exemplo de código a seguir demonstra como poderíamos acrescentar
algumas regras de validação declarativas em duas das propriedades do
nosso modelo "Product":
Estamos
usando os atributos [Required] (Obrigatório) e [Range] (Limite) acima. Esses atributos de validação residem dentro do namespace
System.ComponentModel.DataAnnotations que é nativo no .NET 4, e que pode
ser utilizado independentemente do EF. As mensagens de erro
especificadas neles podem ser explicitamente definidas (como acima) - ou
recuperadas de arquivos de recurso .resx (que torna fácil a localização
de aplicações).
Imposição/Obrigatoriedade da Validação em SaveChanges()
A
EF Code-First (começando com a CTP5) agora aplica e impõe
automaticamente as regras de validação DataAnnotation quando um objeto
do modelo é atualizado ou salvo. Você não precisará escrever qualquer código para fazer valer as regras - esse suporte agora é ativado por padrão.
Esse
novo suporte significa que o código a seguir - o qual viola as nossas
regras definidas acima - gerará automaticamente uma exceção quando
chamarmos o método "SaveChanges()" em nosso DbContext Northwind:
A exceção DbEntityValidationException
que é gerada quando SaveChanges() é chamado contém uma propriedade
"EntityValidationErrors" que você pode usar para recuperar a lista de
todos os erros de validação que ocorreram quando a modelo estava
tentando salvar. Isso permite que você facilmente oriente o usuário
sobre como corrigir os erros. Note que a EF Code-First vai abortar a
operação inteira de mudanças, se uma regra de validação for violada -
garantindo assim que nosso banco de dados esteja sempre em um estado
válido, consistente.
A imposição da validação da EF Code-First
funciona tanto para atributos DataAnnotation nativos do .NET (como
Required, Range, RegularExpression, StringLength, etc), bem como para
qualquer regra de validação personalizada que você crie em sub-classes
da classe base System.ComponentModel.DataAnnotations.ValidationAttribute.
Suporte para Validação na UI
Vários
de nossos frameworks de UI no .NET também oferecem suporte para regras
de validação baseadas em DataAnnotation. Por exemplo, ASP.NET MVC,
ASP.NET Dynamic Data, e Silverlight (via WCF RIA Services) fornecem
suporte para a exibição de validação de dados na UI no lado do cliente
que respeitam as regras DataAnnotation aplicadas em objetos do modelo.
O
screen-shot a seguir demonstra como usar o modelo "Add-View" padrão
dentro de uma aplicação ASP.NET MVC 3 que fará com que mensagens de erro
de validação apropriadas sejam exibidas se valores adequados não forem
providos:
A
ASP.NET MVC 3 suporta a obrigatoriedade destas validações tanto no
lado do cliente como no lado do servidor. As mensagens de erro exibidas
são automaticamente retornadas a partir dos atributos de validação
declarativos - eliminando a necessidade de escrever qualquer código
personalizado para exibí-las.
Mantendo as coisas DRY
O
"princípio DRY" significa "Não Repita Você Mesmo", e é uma prática que
recomenda que você evite a duplicação de lógica/configuração/código em
vários locais de toda a sua aplicação e, ao invés disso especifique a
lógica/configuração/código apenas uma vez aplicando-o em todos os
lugares.
A CTP5 da EF Code-First agora permite que você aplique
validações DataAnnotation declarativas em suas classes do modelo
(especificando as mesmas uma única vez) e, então, a lógica de
validação será imposta (e mensagens de erro correspondentes serão
exibidas) em todos os cenários da aplicação - dentro de controladores,
visões, e scripts no lado do cliente, e em qualquer código personalizado
que atualiza e manipula as classes do modelo.
Isso torna muito mais fácil construir boas aplicações com código limpo - aplicações que podem iterar e evoluir rapidamente.
Outras melhorias da EF Code First Novas na CTP5
A
CTP5 da EF Code First inclui um conjunto de outras melhorias também. A
seguir estão algumas descrições curtas de algumas delas:
A
EF Code First permite que você substitua um método "OnModelCreating()"
na classe DbContext para refinar/substituir as regras de mapeamento do
esquema usado para mapear classes do modelo para o esquema do banco de
dados. A CTP5 inclui alguns refinamentos na classe ModelBuilder que é
passada para este método que podem tornar a definição de regras de
mapeamento mais limpa e concisa. A Equipe do ADO.NET escreveu alguns exemplos de como fazer isso aqui (em Inglês).
- Suporte à Convenções Plugáveis
A
CTP5 da EF Code First fornece um novo suporte que permite substituir as
"convenções padrão" que a EF Code First honra, e, opcionalmente, te
permite substituir as mesmas com seu próprio conjunto de convenções.
- Nova API de Monitoramento de Alterações/Mudanças
A
CTP5 da EF Code First expõe um novo conjunto de informações de
monitoramento de alterações que permite que você acesse valores
Originais, Correntes e Armazenados, e Estado (por exemplo Added
(Adicionado), Unchanged (Inalterado), Modified (Modificado), Deleted
(Deletado)). Este suporte é útil em uma variedade de cenários.
- Melhoria para Resolução de Conflitos de Concorrência
A
CTP5 da EF Code First oferece melhores mensagens de exceção que
permitem acesso à instância do objeto afetado e a capacidade de resolver
conflitos utilizando valores correntes, originais e do banco de dados.
- Suporte à Consultas e Comandos SQL Puros (Raw)
A
CTP5 da EF Code First agora permite consultas e comandos SQL puros
(incluindo Stored Procedures) de forma que estes sejam executados
através dos métodos SqlQuery e SqlCommand expostos fora da propriedade
DbContext.Database. Os resultados dessas chamadas aos métodos podem ser
materializados em instâncias de objeto que podem ser opcionalmente
controladas pelo monitoramento de alterações do DbContext. Isso é útil
em uma variedade de cenários avançados.
- Suporte Completo para Data Annotations
A
CTP5 da EF Code First suporta agora todas as DataAnnotations padrão do
.NET, e pode usá-las tanto para realizar a validação, bem como para
criar automaticamente o esquema do banco de dados apropriado quando a EF
Code First é usada em um cenário de criação de banco de dados.
Resumo
A
EF Code First provê uma maneira elegante e poderosa para trabalhar com
dados. Eu realmente gosto dela porque ela é extremamente limpa e
suporta as melhores práticas, permitindo também que as soluções sejam
implementadas muito, muito rapidamente. A abordagem code-only (apenas
código) da biblioteca significa que as camadas do modelo acabam sendo
flexíveis e fáceis de personalizar.
O lançamento da CTP5 desta
semana refina a biblioteca EF Code First e ajuda a garantir que ela será
muito agradável quando for lançada no início do ano que vem. Eu
recomendo usar o NuGet para instalar e testar a mesma hoje. Eu acho que
você vai ser surpreendido ao perceber o quão incrível ela é.
Espero que ajude,
Scott
Texto traduzido do post original por
Leniel Macaferi.