Apresentando LINQ to Entities (Entity Framework)


Não há como negar que a maior parte do desenvolvimento das aplicações na atualidade envolvem a utilização de um banco de dados relacional.

Não há como negar também que embora o modelo relacional esteja muito bem consolidado ele continua a ser uma pedra no sapato quando as aplicações precisam interagir um modelo conceitual de objetos com um modelo relacional de dados.

Neste ponto acabamos em uma encruzilhada, onde de um lado temos o esquema dos banco de dados relacionais, que não se mostram ideais para criar aplicações visto que o modelo conceitual é diferente do modelo lógico dos banco de dados, e, do outro a necessidade de criar aplicações que acessam a dados e que necessitam de um mapeamento objeto relacional para reduzir o que chamamos de impedância do modelo.

Este é o motivo de tanta discussão sobre o assunto, e, atualmente não faltam opções para tentar resolver o problema com a utilização de frameworks que tentam diminuir esta lacuna através da realização do mapeamento entre o modelo conceitual (geralmente objetos) da aplicação e o modelo lógico dos bancos de dados relacionais.

Para a plataforma .NET o mais famoso é o nHibernate e atualmente o LINQ que já vem integrado com a plataforma e introduz novos conceitos de forma a realizar a persistência, mapear os objetos para as tabelas do banco de dados, oferecer uma sintaxe de consulta a dados próxima da linguagem do desenvolvedor e assim aumentar sua produtividade. A ferramenta cria um Modelo de dados da entidade conhecido como EDM - Entity Data Model.

O Entity Data Model - EDM é um modelo conceitual de dados que pode ser usado para modelar os dados de um domínio particular de forma que as aplicações podem interagir com os dados como se fossem entidades ou objetos. O conceito central no EDM são as entidades que são instâncias de tipos de entidades; Ex: Cliente, Produto, etc, as quais são registros estruturados com uma chave. Uma entidade chave é formada a partir de um subconjunto de propriedades de uma entidade tipo; Ex:  ClienteID, ProdutoID, etc. e é um conceito fundamental para identificar de forma única e assim atualizar instâncias de entidades e permitir que elas participam dos relacionamentos.

Aplicações que usam o EDM definem entidades e relacionamento no domínio da aplicação em um esquema que é usado para construir classes programáveis que são usadas pela código da aplicação.

Através do EDM a ADO .NET expõe as entidades como objetos no ambiente .NET o que torna a camada de objetos um destino ideal para o suporte a LINQ. É por isso que LINQ to ADO .NET inclui LINQ to Entities.

O recurso LINQ To Entities permite que o desenvolvedor escreva consultas contra um banco de dados a partir da mesma linguagem usada para construir a lógica de negócio.


O diagrama acima mostra o relacionamento entre LINQ To Entities e o  Entity Framework, ADO .NET 2.0 e o Data Source
 

Quem realiza a integração das funcionalidades do ADO .NET 2.0 (DataSet, DataAdapter,etc..) com o Entity Data Model e o LINQ é o ADO .NET Entity Framework. (Que será objeto de um artigo em breve.)

Se você conhece LINQ to SQL deve estar pensando que afinal LINQ to Entities é a mesma coisa. Mas não é.

"What is the difference between LINQ to SQL and LINQ to Entities? " (Mike Pizzo (Architect, Data Programmability) 04/2007:)

LINQ to SQL supports rapid development of applications that query Microsoft SQL Server databases using objects that map directly to SQL Server schemas.  LINQ to Entities supports more flexible mapping of objects to Microsoft SQL Server and other relational databases through extended ADO.NET Data Providers."

O LINQ To SQL esta restrito ao SQL Server (por enquanto...) já o LINQ To Entities é mais flexível e pode ser usado com qualquer banco de dados relacional (como já faz hoje o nHibernate). Na verdade LINQ To SQL pode ser visto como um subconjunto do LINQ to Entities.

Veja a seguir a comparação de algumas características entre os dois LINQs :

Característica

LINQ to SQL

LINQ to Entities

Language Extensions Support

Sim

Sim

Language Integrated Database Queries

Sim

Sim

Many-to-Many (3way Join/Payload relationship)

Não

Não

Many-to-Many

Não

Sim

Stored Procedures

Sim

Não

Entity Inheritance

Não

Sim

Single Entity from Multiple Tables

Não

Sim

Identity Management / CRUD features

Sim

Sim

O LINQ to SQL é mapeado diretamente para as tabelas do banco de dados e o LINQ to Entities , leia-se aqui o Entity Framework, permite criar um modelo de objetos baseados nas tabelas do banco de dados qualquer.

Nota: O LINQ to Entities é dependente do ADO .NET Entity Framework para realizar o mapeamento objeto relacional.

Através do Entity Framework, leia-se LINQ to Entities, você pode criar uma classe que representa o seu modelo conceitual e ele irá fazer o mapeamento para o modelo relacional.

Nota: O Entity Framework não esta integrado ainda com o Visual Studio e pode ser baixado através do link: ADO .NET Entity Framework Beta 2

Essa discussão pode deixar confuso quem esta iniciando na plataforma .NET e tendo o seu primeiro contato com ADO .NET e o acesso a dados.

Afinal ADO .NET vai acabar ?

Vou ser obrigado a usar LINQ ?

Nada disso, na verdade o LINQ (to SQL, to Entities, to ...) pode ser visto como mais uma opção de acesso a dados com recursos interessantes que precisam ser bem conhecidos.

Você pode usar o ADO .NET para o acesso a dados, e muitas vezes esse é o caminho mais recomendado, ou, se a situação mostrar que a utilização de um mapeamento objeto relacional for mais adequado (verifique o desempenho) , pode usar o LINQ.

O que você não pode fazer é ignorar a evolução que a plataforma vem oferecendo e deixar de conhecer os recursos do LINQ e do LINQ to Entities.

A seguir mostrarei como criar um projeto usando LINQ to Entities no Visual Studio. Aguarde...

Nota: Veja a seção LINQ com diversos artigos sobre LINQ.

Referências:


José Carlos Macoratti