Entity Framework Core 1

Introdução

A Entity Framework é a tecnologia para acesso a dados recomendada pela Microsoft. A sua próxima versão (disponível a partir de Junho de 2016) será a quinta e promete ser revolucionária em vários sentidos. Este artigo irá revelar o que precisa de saber sobre ela.

História

A Entity Framework foi lançada em conjunto com o Service Pack 1 da framework .NET versão 3.5, em meados de 2009. No início, dividiu atenções com o LINQ to SQL, outra framework de acesso a dados lançada ao mesmo tempo; por esta, no entanto, ser mais simples e limitada unicamente a SQL Server, cedo foi deixada para trás, passando a Microsoft a recomendar a utilização da Entity Framework para todos os cenários de acesso a bases de dados relacionais.

Com a primeira versão da Entity Framework, a Microsoft iniciou uma aventura num mercado onde já existiam outros participantes, sendo o mais notório o NHibernate. Como framework ORMObject-Relational Mapper –, a Entity Framework encontrava-se então muito longe do que estes outros participantes ofereciam, beneficiando, no entanto, de bom suporte a LINQ, tecnologia então nos seus primórdios, e que se viria a revelar essencial.

A segunda encarnação foi introduzida com o .NET 4.0 e trouxe consigo o suporte opcional a Plain Old CLR Objects (POCOs) – simples classes .NET sem necessidade de herdar de uma classe específica da framework, carregamento implícito (lazy loading) e a possibilidade de personalizar os modelos T4 usados para gerar as classes, quer quando o modelo era importado da base de dados, quer quando este era definido no editor integrado no Visual Studio.

Com a terceira versão lançada, 4.1, a Microsoft passou a propor um novo fluxo para o desenvolvimento: começar com o código (modelo POCO) e a partir daí gerar a base de dados. Esta abordagem adequa-se bem à metodologia de desenvolvimento conhecida por Domain-Driven Design (DDD), a qual advoga em primeiro lugar a representação por meio de classes de todos os conceitos do domínio de negócio, sendo a persistência um aspecto que, embora claramente importante, deve ser o mais transparente possível, não devendo limitar as opções de desenho do modelo de domínio. Passaram a existir convenções para definir grande parte da tradução de e para o modelo relacional, sendo desnecessário configurar todos os detalhes explicitamente. O novo API DbContext, grandemente simplificador relativamente ao ObjectContext, revelou-se extremamente popular, apesar de algumas ausências, totalmente aceitáveis numa primeira versão, e o mesmo se passou com a nova funcionalidade de migrações, poderosa, que trouxe para o mundo das bases de dados as funcionalidades de controlo de versões, tão bem conhecidas dos programadores. Passou a falar-se de Entity Framework Code First.

Brevemente a Microsoft disponibilizou uma actualização – 5 – que introduziu tipos de dados enumerados e geo-espaciais ao modelo Code First, bem como a possibilidade de chamar funções SQL transparentemente em pesquisas LINQ através de métodos estáticos em classes .NET.

Finalmente, a versão 6 veio culminar o processo de maturação da Entity Framework como ferramenta ORM de pleno direito, com suporte a intercepção e logging de chamadas, uso de stored procedures para operações Create-Update-Delete (CUD), possibilidade de definição de convenções personalizadas, e, uma das funcionalidades mais apreciadas, a possibilidade de efectuar a maior parte das operações de forma assíncrona. Muitas das funcionalidades previamente introduzidas foram também alvo de melhoramentos, com destaque para as migrações. Parecíamos estar no bom caminho.

Eis senão quando a Microsoft veio baralhar completamente o jogo, com o anúncio da sua nova versão, designada inicialmente por 7, e, mais tardiamente, por Core 1, nome que ficou.

Entity Framework: evolução
Figura 1: Evolução da Entity Framework

Funcionalidades Adicionadas ou Alteradas

Novo Código

A EF Core foi totalmente escrita de raiz. Esta decisão teve a ver com o desejo da Microsoft de se ver livre de código “legado”, muito do qual praticamente não era usado – alguém usa Entity-SQL ou o ObjectContext desde a saída do Code First? – mas também com a necessidade de uma profunda alteração que permitisse a implementação de novas funcionalidades radicalmente incompatíveis com a anterior arquitectura. Esta abordagem, com méritos, veio, no entanto, causar algumas limitações à versão inicial, 1.0, como veremos a seguir.

Instalação

À semelhança das anteriores versões, a EF Core irá ser disponibilizada exclusivamente através do Nuget. A diferença é que, ao invés de um único pacote Nuget, teremos de instalar vários, consoante as necessidades:

Tabela 1: Pacotes Nuget
Pacote Descrição
Microsoft.EntityFrameworkCore Classes base da Entity Framework
Microsoft.EntityFrameworkCore.Tools Outras funcionalidades (migrações, p.ex.)

NoSQL

O mundo em 2015 e 2016, no que respeita às Tecnologias de Informação, é diferente do que era em 2009. Por um lado, o movimento No SQL ou Not-Only SQL, ganhou grande preponderância – passou a ser normal, numa empresa, a utilização de vários tipos de tecnologias para armazenamento de dados, mesmo concorrentemente, para responder a diferentes necessidades. Se a Entity Framework no início correspondia ao que as pessoas esperavam, pode argumentar-se que já não é assim. Revelando atenção às novas tendências, a Microsoft tornou a nova versão da Entity Framework agnóstica em relação às fontes de dados de uma forma inédita: passou a suportar não apenas bases de dados relacionais mas potencialmente qualquer fonte de dados, incluindo NoSQL, através de um mecanismo de providers. Foram anunciadas duas provas de conceito, na forma de providers para Azure Table Storage e para o muito popular serviço de cache distribuída Redis, mas este anúncio fica, para já, pela intenção, já que a versão inicial, Core 1.0, não irá incluir esta funcionalidade. A ideia é promissora – usar a mesma API para efectuar consultas a potencialmente qualquer fonte de dados – mas teremos de esperar para ver.

Múltiplas Plataformas

Sendo construída de raiz com suporte ao .NET Core, a versão de .NET multi-plataforma, a Entity Framework Core irá, assim, correr nos sistemas operativos Linux, MacOS, FreeBSD e Windows, bem como em dispositivos móveis usando Windows 10 e aplicações desenvolvidas para a Windows Store. Tal não exclui, no entanto, a utilização em aplicações .NET 4.6 ou superior, a qual continuará a ser, por agora e durante muito tempo, largamente dominante.

Configuração de Fornecedores de Dados

É substancialmente mais fácil a configuração de fornecedores de dados, passando a existir um método virtual na classe DbContext exclusivamente para esse efeito: trata-se do método OnConfiguring:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
   optionsBuilder.UseSqlServer(@"Data Source=.\SQLEXPRESS; Integrated Security=SSPI; Initial Catalog=Blogs;")
   base.OnConfiguring(optionsBuilder);
}
Código 1: Configuração do fornecedor SQL Server

Este exemplo ilustra a utilização do fornecedor SQL Server. Outro exemplo, agora para o fornecedor em memória (requer a instalação do pacote Microsoft.EntityFrameworkCore.InMemory):

optionsBuilder.UseInMemoryDatabase();
Código 2: Configuração do fornecedor In-Memory

Para que possamos usar um fornecedor, será necessário instalar o seu pacote Nuget. Os pacotes incluídos na versão 1 da Entity Framework Core são:

Tabela 2: Fornecedores de acesso
Nome Descrição
Microsoft.EntityFrameworkCore.SqlServer Fornecedor de acesso para SQL Server
Microsoft.EntityFrameworkCore.SQLite Fornecedor de acesso para SQLite
Microsoft.EntityFrameworkCore.InMemory Fornecedor de acesso in-memory (para testes)
Npgsql.EntityFrameworkCore.PostgreSQL Fornecedor de acesso para PostgreSQL
EntityFrameworkCore.SqlServerCompact35
EntityFrameworkCore.SqlServerCompact40
Fornecedores de acesso para SQL Server Compact 3.5 e 4.0
*.Design Fornecedores para geração de entidades a partir de uma base de dados relacional (p.ex., Microsoft.EntityFrameworkCore.SqlServer.Design)

Para cada um destes existe um método de extensão específico para a classe DbContextOptionsBuilder, o qual aceita diferentes parâmetros, tais como a connection string a usar (o in-memory não aceita nenhum).

Podemos ver a lista de fornecedores sempre actualizada em https://docs.efproject.net/en/latest/providers/index.html.