Dev (Back & Front)ARTIGO

Entity Framework – usando EntityClient

O Entity Framework possui o provedor de dados
EntityClient
, namespace System.Data.EntityClient,
que possui um modelo semelhante aos objetos ADO .NET e usa os seguintes objetos
:
EntityCommandDefinition
,

EntityConnection
,

EntityConnectionStringBuilder
,

EntityDataReader
,

EntityParameter
, EntityParameterCollection,

EntityProviderFactory

e

EntityTransaction
. Abaixo temos um resumo do papel de
cada um:


EntityCommand


Representa um comando para ser executado em um modelo de dados de entidades
(EDM).


EntityConnection


Representa uma conexão para um armazenamento de dados subjacentes


EntityConnectionStringBuilder

Fornece
uma maneira simples para criar e gerenciar o conteúdo de seqüências de
conexão usadas pela classe EntityClient.


EntityDataReader

Um EntityDataReader é um
leitor somente-leitura de acesso sequencial.


EntityParameter


Representa um parâmetro para um

EntityCommand
.


EntityParameterCollection


Representa um coleção de parametors associados com o um

EntityCommand
.


EntityProviderFactory


Representa um conjunto de métodos para criar instâncias de implementação de
um provedor de uma fonte de dados.


EntityTransaction


Especifica a transação para um EntityCommand().

O provedor EntityClient usa as classes de
provedores de dados específicos ADO .NET e efetua o mapeamento dos metadados
para interagir com o modelo de entidades. O EntityClient também traduz as
operações realizadas em entidades conceituais para operações realizadas em uma
fonte de dados física e conjuntos de dados retornados a partir de uma fonte de
dados física para o modelo conceitual de entidades.

Os comandos para este provedor usando o
Entity SQL
operam nas entidades definidas no modelo de entidades e nos
objetos do Object Services, e é parecido com o T-SQL. Você
pode usar os Serviços de Objetos (Object Services) para
interagir com o EDM usando o EntitySQL ou o LINQ
to Entities
.

Abaixo temos uma figura onde vemos os
Object Services
na composição do Entity Framework
e podemos ver onde o EntityClient está posicionado: bem acima dos
provedores de dados ADO .NET.

Vou mostrar como você pode usar o EntityClient
para realizar operações no banco de dados e você vai perceber que ele tem uma
sintaxe muito parecida com a ADO .NET.

Para iniciar vou mostrar como acessar o banco de
dados Northwind.mdf do SQL Server e obter os dados da tabela
Categories em uma aplicação Windows Forms.

Abra o Visual Studio 2008
e crie um novo projeto do tipo Windows Application com o nome
EntityClient_Demo;

Vamos incluir uma referência ao System.Data.Entity
em nosso projeto. No menu Project selecione Add Reference e
selecione a referência na aba .NET conforme a figura a seguir;

Aproveite e também inclua uma referência a
System.Configuration, pois irei mostrar como obter a string de conexão a
partir do arquivo App.Config (este passo é opcional).

Agora inclua um controle
ListBox – ListBox1 – no formulário padrão e um botão de comando com o
texto “Carregar”, conforme o leiaute abaixo:

O próximo passo é gerar o modelo de entidades sobre
o qual iremos trabalhar. Você pode fazer isso usando a ferramenta edgm, a
partir da linha de prompt de comando do Visual Studio, ou usar o assistente para
criação de um EDM.

Se você optar por gerar o modelo de entidades
usando a ferramenta edgm, terá que abrir uma linha de comando e digitar a
seguinte linha de comando:

edmgen /connectionString:"Server=MAC\SQLEXPRESS;Initial <br />Catalog=Northwind;Integrated Security=True" /mode:FullGeneration /project:"NorthwindEntities"

onde :

/connectionString: => Representa a string de
conexão com o banco de dados Northwind na minha máquina local (MAC\SQLEXPRESS);
é óbvio que no seu caso esta string terá que ser diferente da minha;

/mode:FullGeneration
=> Gera os arquivos de metadados ssdl, msl,
csdl  e os objetos a partir do banco de dados;

/project:
=> O nome base que será usado no projeto;

Ao final da execução do comando você deverá obter o
seguinte resultado exibido no prompt de comandos (observe que podemos ter
avisos, mas não erros):

Se você preferir usar o assistente, é bem mais
simples: basta inserir um novo item no projeto e selecionar o ADO .NET Entity
Data Model e arrastar e soltar as tabelas no descritor EDM.

Selecione o formulário form1.vb criado por padrão
no projeto e alterne para a visão de código incluindo no início do formulário as
declarações:

Imports
System.Data.EntityClient
Imports System.Data
Imports System.Configuration

Agora vamos criar uma rotina chamada
carregaCategorias() conforme abaixo:

 Private  Sub carregarCategorias()<br /><br /><br />Using con As New EntityConnection()<br /><br /><br />          con.ConnectionString = "metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;" & _<br /><br />                                                 "provider=System.Data.SqlClient;" & _<br /><br />                                                            "provider connection string='Server=MAC\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True';"<br /><br /><br />              Dim cmd As EntityCommand = con.CreateCommand()<br /><br /><br />           cmd.CommandText = "SELECT value e From NorthwindEntities.Categories AS e"<br /><br />           con.Open()<br /><br /><br />           Using rd As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)<br /><br />               While (rd.Read)<br /><br />                   ListBox1.Items.Add(rd("CategoryID") & " - " & rd("CategoryName"))<br /><br />               End While<br /><br />              End Using<br /><br /><br />End Using<br /><br /><br />End Sub

A primeira tarefa é criar uma EntityConnection(), lembrando que  uma EntityConnection não é uma conexão com um banco
de dados. Embora você possa abrir e fechar uma EntityConnection, isso não
significa que você está abrindo e fechando uma conexão com um banco de dados. Se
você usar o EntityClient diretamente ou deixar que os Object Services
executem os seus comandos e consultas, a EntityConnection será apenas um
caminho para a conexão com o banco de dados.

Uma EntityConnection é composta por 4
partes:

  1. MetaData – O ponteiro para os arquivos de
    metadados CSDL, MSL e SSDL;
  2. Provider Name – O namespace do provedor
    do banco de dados;
  3. Provider Connection – a string de conexão
    com o banco de dados;

Você pode definir a EntityConnection
declarativamente no arquivo de configuração (app.config
ou web.config) . Abaixo temos um exemplo onde o nome da string de
conexão e da string EntityConnection são definidos em um arquivo app.config:

<connectionStrings><br /><add name="MacorattiEntities"<br />connectionString="metadata=res://*/MACModel.csdl|res://*/MACModel.ssdl|res://*/MACModel.msl;<br />provider=System.Data.SqlClient;<br />provider connection string='Data Source=.\SQLEXPRESS;Initial Catalog=Macoratti;Integrated Security=True;<br />MultipleActiveResultSets=True'"<br />providerName="System.Data.EntityClient"<br />/><br /></connectionStrings>

01. No nosso exemplo eu defini a string de
conexão para a EntityConnection diretamente no código, conforme :

con.ConnectionString = metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;" & _<br /><br />"provider=System.Data.SqlClient;" & _<br /><br />"provider connection string='Server=MAC\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True';"

Outra forma de obter a string de conexão seria a
partir do arquivo App.Config, neste caso teríamos que incluir a
referência ao namespace System.Configuration no projeto e definir a
string de conexão da seguinte forma:

con.ConnectionString = ConfigurationManager.ConnectionStrings(“NorthwindEntities”).ToString

Neste caso o arquivo App.Config teria que ser criado com o seguinte
conteúdo:

<?xml version="1.0" encoding="utf-8"?><br /><br /><configuration><br /><br /><connectionStrings><br /><br /><add name="NorthwindEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;<br />provider=System.Data.SqlClient;provider connection string=;Data Source=MAC\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;MultipleActiveResultSets=True;" /><br /><br /></connectionStrings><br /><br /></configuration> 

02. A seguir eu criei um EntityCommand 
que conterá o comando Entity SQL usado para ser executado contra o banco
de dados.

Dim cmd As <br />EntityCommand = con.CreateCommand()

O Entity SQL é parecido com a SQL
tradicional, mas coloca ênfase nas entidades definidas no modelo de entidades (EDM)
e introduz dezenas de palavraschave e recursos que se eu fosse detalhar teria
que escrever um artigo só para tratar desse assunto.

Ele trabalha diretamente com o modelo conceitual e
suporta as características do EDM como herança e relacionamento. Além disso, dá
suporte a Collections, Expressions, etc. mas
não dá suporte ao seguintes recursos da T-SQL:  DML (insert, update,
delete), DDL, Programação imperativa, Funções agrupadas, Funções analíticas,
Operadores.

03. Em seguida definimos o comando
Entity SQL e abrimos a conexão:

cmd.CommandText = "SELECT value e From NorthwindEntities.Categories AS e"<br />con.Open()

Observe que o CommandText usa o formato
ContainerName.EntityName (NorthwindEntities.Categories)
para acessar a entidade no modelo de entidades.

04. Criamos um EntityDataReader usando o
comando ExecuteReader para retornar um datareader e em seguida
percorremos o datareader e exibimos o código da categoria e o seu nome no
ListBox:

         Using rd As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)<br /><br />               While (rd.Read)<br /><br />                   ListBox1.Items.Add(rd("CategoryID") & " - " & rd("CategoryName"))<br /><br />               End While<br /><br />              End Using

Um EntityDataReader é um leitor
somente-leitura de acesso sequencial de um fluxo de linhas de uma fonte
de dados e pode ser obtido a partir do método ExecuteReader de um
EntityCommand (cmd).

Executando o projeto e clicando no botão
Carregar iremos obter:

O EntityClient possui
recursos avançados para acessar e retornar dados usando o
SQL Entity. Aguarde em breve mais artigos sobre esse tema.

Um dos motivos para usar o EntityClient
seria a sua sintaxe similar ao ADO .NET e o desempenho em relação ao
LINQ to Entities que dizem ser melhor.

Eu sei, é apenas Entity Framework, mas eu gosto… 

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil