Entity Framework - Usando EntityClient
Neste artigo eu vou falar um pouco sobre o EntityClient. Na verdade eu já o mencionei em meus artigos sobre o Entity Framework(EF).
O EF 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 opera 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 esta 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 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. (Veja as referências para mais detalhes)
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.EntityClientAgora vamos criar uma rotina chamada carregaCategorias() conforme abaixo:
Private Sub carregarCategorias()Using con As New EntityConnection()
"provider=System.Data.SqlClient;" & _ "provider connection string='Server=MAC\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True';"
con.Open()
While (rd.Read) ListBox1.Items.Add(rd("CategoryID") & " - " & rd("CategoryName")) End While End Using End Using 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ê esta 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 é composto por 4 partes:
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> <add name="MacorattiEntities" connectionString="metadata=res://*/MACModel.csdl|res://*/MACModel.ssdl|res://*/MACModel.msl; provider=System.Data.SqlClient; provider connection string='Data Source=.\SQLEXPRESS;Initial Catalog=Macoratti;Integrated Security=True; MultipleActiveResultSets=True'" providerName="System.Data.EntityClient" /> </connectionStrings> |
1-) No nosso exemplo eu definir 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;" & _
"provider=System.Data.SqlClient;" & _
"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"?>< configuration>< connectionStrings>< add name="NorthwindEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=;Data Source=MAC\SQLEXPRESS;Initial Catalog=Northwind;Integrated Security=True;MultipleActiveResultSets=True;" /> </ connectionStrings></ configuration> |
2-) A seguir eu criei um EntityCommand que conterá o comando Entity SQL usado para ser executado contra o banco de dados.
Dim cmd As EntityCommand = con.CreateCommand()
O Entity SQL é parecido com a SQL tradicional mas coloca o ênfase nas entidades definidas no modelo de entidades (EDM) e introduz dezenas de palavras chaves e recursos que seu 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.
3-) Em seguida definimos o comando Entity SQL e abrirmos a conexão:
cmd.CommandText = "SELECT value e From NorthwindEntities.Categories AS e"
con.Open()
Observe que o CommandText usa o formato ContainerName.EntityName (NorthwindEntities.Categories) para acessar a entidade no modelo de entidades.
4-) 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)
While (rd.Read)
ListBox1.Items.Add(rd("CategoryID") & " - " & rd("CategoryName"))
End While
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ências:
The Entity-RelationShip Model - Toward a Unified View of Data - http://csc.lsu.edu/news/erd.pdf - Peter Chen