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:
Representa um comando para ser executado em um modelo de dados de entidades (EDM). |
|
Representa uma conexão para um armazenamento de dados subjacentes |
|
| Fornece uma maneira simples para criar e gerenciar o conteúdo de seqüências de conexão usadas pela classe EntityClient. |
|
| Um EntityDataReader é um leitor somente-leitura de acesso sequencial. |
|
Representa um parâmetro para um EntityCommand. |
|
Representa um coleção de parametors associados com o um EntityCommand. |
|
Representa um conjunto de métodos para criar instâncias de implementação de um provedor de uma fonte de dados. |
|
|
|
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 SubA 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:
- MetaData – O ponteiro para os arquivos de
metadados CSDL, MSL e SSDL; - Provider Name – O namespace do provedor
do banco de dados; - 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 UsingUm 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…








