O time do Entity Framework recentemente anunciou (em Inglês) a 2ª versão alpha do EF6. O pacote alpha 2 está disponível para download a partir do NuGet.
Uma vez que este é um pacote de pré-lançamento, certifique-se de
selecionar "Include Prereleases" (Incluir pré-versões) no gerenciador de
pacotes NuGet, ou execute o seguinte comando no console do gerenciador
de pacotes para instalá-lo:
PM> Install-Package EntityFramework -Pre
O lançamento alpha desta semana inclui um conjunto de grandes melhorias nas seguintes áreas:
- Suporte ao modelo de programação Async está disponível agora para consultas e atualizações quando rodando no .NET 4.5.
- Convenções
personalizadas agora fornecem a capacidade de substituir as convenções
padrão que a abordagem Code First usa para mapear tipos, propriedades,
etc, para o seu banco de dados.
- Migrações Mlti-tenant
(múltiplos bancos de dados) permitem que o mesmo banco de dados seja
utilizado por múltiplos contextos com total suporte às Migrações Code
First para evoluir independentemente o modelo que sustenta cada
contexto.
- Enumerable.Contains em uma consulta LINQ agora é
tratado com muito mais eficiência pelo EF e o provedor SQL Server
resultando em um desempenho muito melhor.
- Todos os recursos
do EF6 (exceto async) estão disponíveis em ambos .NET 4 e NET 4.5. Isso
inclui suporte para enums, tipos espaciais e as melhorias de
desempenho que anteriormente estavam disponíveis apenas quando se usava o
.NET 4.5.
- O tempo de inicialização para muitos modelos
grandes foi dramaticamente melhorado graças a um melhor desempenho na
geração de visões.
A seguir estão alguns detalhes adicionais sobre algumas das melhorias descritas acima:
Suporte Async
O .NET 4.5 introduziu o Task-Based Asynchronous Pattern (Modelo Assíncrono Baseado em Tarefas) que usa as palavras-chave async e await
para tornar a escrita de código assíncrono mais fácil. O EF 6 agora
suporta esse modelo. Isso é ótimo para aplicações ASP.NET porque
chamadas ao banco de dados feitas através do EF podem ser processadas de
forma assíncrona - evitando qualquer bloqueio de worker threads
(threads de trabalho). Isso pode aumentar a escalabilidade do servidor,
permitindo que mais solicitações sejam processadas enquanto o servidor web
espera por uma resposta do banco de dados.
O código a seguir mostra um controlador MVC que está consultando um banco de dados para uma lista de entidades de localização:
public class HomeController : Controller
{
LocationContext db = new LocationContext();
public async Task<ActionResult> Index()
{
var locations = await db.Locations.ToListAsync();
return View(locations);
}
}
Observe acima a chamada para o novo método ToListAsync com a palavra-chave await. Quando o servidor web chega nesse código, ele inicia o solicitação ao
banco de dados, mas em vez de ficar bloqueado enquanto aguarda os
resultados, a thread que está processando a solicitação retorna ao pool
de threads, permitindo que a ASP.NET processe outra solicitação que está
chegando usando a mesma thread. Em outras palavras, uma thread só é
consumida quando há trabalho de processamento a ser realizado,
permitindo que o servidor web trate mais solicitações
simultâneas/concorrentes com os mesmos recursos.
Uma explicação mais detalhada passo a passo
(em Inglês) que cobre o suporte async no EF está disponível com
informações adicionais e exemplos. Um passo a passo está disponível
mostrando como usar async em uma aplicação ASP.NET MVC (em Inglês).
Convenções Personalizadas
Ao
trabalhar com a abordagem EF Code First, o comportamento padrão é
mapear classes .NET para tabelas do banco de dados usando um conjunto de
convenções padrão incluído no EF. Por exemplo, a abordagem Code First detectará
propriedades que terminam com "ID" e irá configurá-las automaticamente
como chaves primárias.
No entanto, às vezes você não pode ou não
quer seguir essas convenções e prefere fornecer suas próprias
convenções. Por exemplo, talvez todas as suas propriedades de chave primária terminam com "Key" ao invés de "Id". Convenções
personalizadas permitem que as convenções padrão sejam substituídas ou
que novas convenções sejam acrescentadas de modo que a abordagem Code
First possa mapear por convenção usando quaisquer regras que tenham
sentido para o seu projeto.
O código a seguir demonstra o uso de
convenções personalizadas para definir a precisão de todas as
propriedade do tipo decimal para 5. Como acontece com outras configurações Code First (em Inglês), esse código é colocado no método OnModelCreating, o qual é substituído em sua classe DbContext derivada:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Properties<decimal>()
.Configure(x => x.HasPrecision(5));
}
Mas
o que acontece se existirem lugares onde uma propriedade decimal deve
ter uma precisão diferente? Assim como acontece com todas as convenções
existentes da abordagem Code First, esta nova convenção pode ser
substituída para uma propriedade em particular simplesmente configurando
explicitamente a propriedade usando a API fluente ou uma data
annotation (anotação de dado).
Uma descrição mais detalhada de convenções customizadas da abordagem Code First está disponível aqui (em Inglês).
Envolvimento da Comunidade
Eu escrevi um tempo atrás sobre o Entity Framework e Open Source (Código Aberto). Desde então, vários membros da comunidade fizeram contribuições e estas contribuições estão incluídas no EF6 alpha 2.
Dois exemplos de contribuições da comunidade são:
- AlirezaHaghshenas
contribuiu com uma mudança que aumenta o desempenho de inicialização do
EF para modelos grandes, melhorando o desempenho da geração de visões. A
alteração significa que é menos frequente e necessário o uso de
visões pré-geradas.
- UnaiZorrilla
contribuiu o primeiro recurso proveniente da comunidade para o EF: a
capacidade de carregar todo o código de configuração da abordagem Code
First em um assembly (DLL) através de uma única chamada de método como o
seguinte:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations
.AddFromAssembly(typeof(LocationContext).Assembly);
}
Este
código irá encontrar e carregar todas as classes que herdam de
EntityTypeConfiguration<T> ou ComplexTypeConfiguration<T>
no assembly onde LocationContext está definido. Isto reduz a quantidade
de acoplamento entre o contexto e as classes de configuração da
abordagem Code First, e é também um atalho muito conveniente para os
modelos de grande dimensão.
Outros Recursos que chegarão com o EF 6
Muita informação sobre o desenvolvimento do EF6 pode ser encontrada no site do EF no CodePlex (em Inglês), incluindo um roteiro (em Inglês) que mostra os outros recursos que estão planejados para o EF6.
Um
dos recursos programados que é bem legal é a resiliência de conexão,
que irá automatizar o processo de reatar as operações de banco de dados
em falhas transitórias comuns em ambientes de nuvem e com bancos de
dados, como o banco de dados SQL da Windows Azure (em Inglês).
Outro
recurso frequentemente solicitado que será incluído no EF6 é a
capacidade de mapear stored procedures para operações de consulta e
atualização de entidades quando se usa a abordagem Code First.
Resumo
O EF6 é o primeiro lançamento do Entity Framework que está sendo desenvolvido no CodePlex. A versão alpha 2 de pré-lançamento do EF6 já está disponível no NuGet, e contém alguns ótimos recursos para você experimentar.
O
time do EF está sempre à procura de feedback (retorno) dos
desenvolvedores - especialmente sobre as novas funcionalidades, tais
como convenções personalizadas da abordagem Code First e suporte async.
Para fornecer feedback, você pode postar um comentário no post de anúncio do EF6 alpha 2 (em Inglês), iniciar uma discussão ou registrar um bug no site CodePlex.
Espero que ajude,
- Scott
P.S. Além do blog, eu também estou utilizando o Twitter para atualizações rápidas e para compartilhar links. Siga-me em: twitter.com/ScottGu
Texto traduzido do post original por
Leniel Macaferi.