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.EntityClient
Imports
System.Data
Imports
System.Configuration

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

Private Sub carregarCategorias()
 

Using con As New EntityConnection()


          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';"


             
Dim cmd As EntityCommand = con.CreateCommand()


           cmd.CommandText = "SELECT value e From NorthwindEntities.Categories AS e"

           con.Open()


           Using
rd As EntityDataReader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)

               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:

  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>
<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: