Entity Framework 6: Alpha2 já está Disponível


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.

No Comments