De que se trata o artigo

Este artigo tem por finalidade abordar o recurso conhecido como LINQ to Entities, utilizado em aplicações que empreguem o Entity Framework como mecanismo de acesso a bases de dados.

Em que situação o tema é útil

O tema é útil quando você deseja aplicar o modelo mapeamento objeto relacional. Com isso você tem a possibilidade de gerar classes/objetos a partir de um SGDB.

LINQ to Entities - Utilizando LINQ em conjunto com o Entity framework

É extremamente comum que muitas aplicações dependam em larga escala de operações de consulta, inclusão, alteração e exclusão de informações armazenadas em base de dados relacionais. Embora o ADO.NET possa suprir este tipo de demanda, o uso de recursos que mapeiem estruturas de um banco de dados para o equivalente em um padrão orientado a objetos, não só contribui para uma maior simplicidade no código-fonte obtido como também resulta em uma maior produtividade em atividades de desenvolvimento. O Entity Framework é um mecanismo voltado para este tipo de finalidade, sendo que a extensão LINQ to Entities permite que você realize consultas em LINQ sobre estruturas geradas a partir desta tecnologia.

Na edição anterior, foi iniciada a discussão sobre a utilização de LINQ com bancos de dados relacionais, através da introdução do mecanismo conhecido como LINQ to SQL. Este artigo conclui a série sobre LINQ, continuando a abordar bancos de dados relacionais com a apresentação da extensão conhecida como LINQ to Entities.

Bancos de dados relacionais correspondem atualmente como principal meio para armazenamento de informações em aplicações. A praticidade representada por este tipo de recurso possibilita os mais variados contextos possíveis para soluções computacionais, e um gerenciamento eficaz dos dados a uma série de processos. As operações necessárias envolvem o uso da linguagem SQL (Structured Query Language).

A plataforma .NET dispõe de um extenso conjunto de recursos para tarefas relacionadas ao acesso a dados. Exemplos são as tecnologias ADO.NET (ActiveX Data Object for .NET) e LINQ to SQL.

No caso do ADO.NET, os principais bancos de dados do mercado oferecem suporte para a construção de soluções .NET baseadas nos mesmos. Embora o ADO.NET conte com uma ampla gama de recursos que atendem praticamente qualquer tipo de demanda, o mesmo não possui um mecanismo nativo para o tratamento de dados por meio de técnicas de orientação a objetos.

Não é o caso do LINQ to SQL, que mesmo sendo uma extensão que suporta apenas o SQL Server, apresenta dispositivos destinados a este fim, e que utiliza uma técnica conhecida como mapeamento objeto-relacional.

O Entity Framework é uma tecnologia que existe desde o .NET 3.5, representando uma alternativa que procura suprir algumas das limitações existentes no LINQ to SQL. Por utilizar em sua estrutura os mecanismos de acesso do ADO.NET, o Entity Framework possui compatibilidade(em teoria)com quaisquer bancos de dados que suportam esta tecnologia (desde que os fornecedores de tais bancos também disponibilizem drivers específicos para a utilização do Entity Framework).

No LINQ to Entities, consultas são executadas sobre classes de objetos geradas via Entity Framework. Estes tipos correspondem a estruturas de um banco de dados relacional como tabelas ou views, por exemplo. Assim, a finalidade deste artigo será demonstrar como o LINQ pode ser usado em conjunto com o Entity Framework, bem como discutir de que maneira são implementadas operações de inclusão, alteração ou exclusão de registros quando da utilização desta ferramenta ORM.

Nota do DevMan

O mapeamento objeto-relacional (ORM ) é uma prática que permite a representação de estruturas de uma banco relacional como classes, facilitando com isto a manipulação dos dados que constituem este tipo de repositório ao longo de um sistema. LINQ to SQL e o Entity Framework são exemplos de frameworks ORM disponibilizados pelo .NET framework; o NHibernate é um outro mecanismo deste tipo, sendo uma ferramenta gratuita baseada no Hibernate da plataforma Java.

Podem ser citados como benefícios decorrentes da utilização de frameworks ORM a obtenção de um código menos extenso e mais conciso, assim como uma maior segurança no acesso a dados.

Visão geral Entity Framework e LINQ to Entities

O ADO.NET Entity Framework permite a manipulação de informações presentes em um banco de dados através da aplicação de técnicas originárias da orientação a objetos. A partir desta abordagem, esta tecnologia procura dispensar os desenvolvedores da necessidade de acesso direto a estruturas de uma base relacional, assim como do conhecimento da sintaxe SQL para manipulação deste repositório.

O Entity Framework parte conceitualmente da ideia de entidades de negócio para abstrair as classes que irão permitir a realização de operações sobre agrupamentos de dados. Entidades devem ser compreendidas como elementos que fazem parte de um contexto e que contam com dados (atributos) que são objeto de interesse para uma aplicação de software. Considerando uma solução de faturamento, notas fiscais, faturas, clientes e produtos seriam alguns exemplos de prováveis entidades que estariam sendo consumidas pela mesma.

As diversas classes que irão permitir a realização de tarefas como consultas, inclusões, alterações ou exclusões de registros são agrupadas em um Entity Data Model (EDM). Este último corresponde à representação gráfica de um modelo lógico que centraliza as diversas entidades necessárias a um determinado contexto, além de controlar os possíveis relacionamentos que se estabelecem entre tais estruturas.

Um Entity Data Model é um arquivo XML de extensão .edmx, sendo normalmente criado a partir de um wizard disponibilizado pelo Visual Studio (no exemplo detalhado mais adiante será utilizado tal recurso). É possível que modelos deste tipo sejam baseados em estruturas de um banco de dados já existente ou não.

Importante salientar que o Entity Framework teve por base para a sua construção a tecnologia ADO.NET. O acesso dados em ADO.NET ocorre por meio de data providers, sendo que é através deste mecanismo que ocorre a comunicação entre aplicação e a base relacional. Cada tipo de banco de dados capaz de ser suportado na plataforma .NET conta com um data provider específico, e geralmente, implementado pelo fabricante da solução.

O uso do Entity Framework com um determinado banco de dados dependerá, basicamente da existência de um EntityClient provider para o acesso a tal repositório de informações. Já um EntityClient, por sua vez, estende um ADO.NET provider convencional, fornecendo os recursos necessários para a manipulação de dados de uma base relacional com consultas escritas em LINQ além de classes que representam estruturas como tabelas e views.

Em termos de arquitetura, os tipos que correspondem as representações gráficas de um Entity Data Model, estão situados no namespace System.Data.Objects. A seguir estão listados os nomes destas classes, bem como a quais estruturas as mesmas se referem:

• ObjectContext: tipo que equivale ao Entity Data Model, sendo o centralizador dos diversos elementos que estarão sendo utilizados por uma aplicação;

• ObjectEntity: entidade cuja estrutura baseia-se em um objeto da base de dados como uma tabela ou view, com os campos sendo representados como propriedades;

• ObjectSet<T>: conjunto de entidades com uma estrutura comum e a partir dos quais são disparadas operações de consulta, inclusão, alteração e exclusão. T corresponde, neste caso, a uma classe derivada de ObjectEntity;

• EntityCollection<T>: tipo utilizado para representar relacionamentos que se estabelecem entre entidades, com isto, normalmente se originando a partir de chaves estrangeiras (foreign keys) presentes na base de dados que originou o modelo. T é uma classe que herda de ObjectEntity, sendo que entidades-pai possuirão propriedades que são, na verdade, coleções derivadas de EntityCollection<T>; já entidades-filhas contam, normalmente, com uma referência do tipo ObjectEntity que aponta para a estrutura-pai.

LINQ to Entities é o mecanismo de consulta empregado pelo Entity framework na recuperação de informações que constem numa fonte de dados vinculada a um modelo. Através desta extensão é possível à realização de queries (consultas) em LINQ empregando instruções convencionais (utilizando from, select, where, orderby, etc.), quanto à utilização de expressões lambdas e métodos que efetuam transformações sobre agrupamentos de dados: isto se deve ao fato das consultas no Entity Framework retornarem coleções de objetos baseadas na interface genérica IQueryable<T> a qual, herda o tipo IEnumerable<T>.

Conforme exemplificado em artigos anteriores, o uso de LINQ to Objects, IEnumerable<T> é a interface básica para a manipulação de coleções de objetos. Consultas em LINQ to Entities retornam instâncias derivadas de IQueryable<T>: objetos de tipos que implementam IQueryable<T> estendem tais características, permitindo a montagem de queries complexas e que se valem de uma técnica chamada de lazy loading para otimizar o acesso a bancos de dados.

Nota do DevMan

IEnumerable<T> é uma interface pertencente ao namespace System.Collections.Generics, sendo normalmente implementada por classes concretas que representem coleções e que façam uso de recursos do mecanismo conhecido como Generics. Um exemplo de tipo que implementa esta interface, é a classe List<T>: uma lista de elementos em que T pode representar um tipo qualquer.

...
Quer ler esse conteúdo completo? Tenha acesso completo