Entity Framework 4 - Operações básicas de acesso a dados - 2


A nova versão do Entity Framework (a versão 4) melhorou muito e, se no início o Entity Framework(EF) já podia ser considerado como uma opção viável para a construção de sua aplicação com acesso a dados, agora você deve realmente considerar que o EF entrou pra valer na briga das ferramentas ORM e persistência.

Como qualquer outra ferramenta OEM o EF não é perfeito mas com certeza evoluirá em futuras versões o que o torna uma opção muito interessante e viável a longo prazo.

Para quem é novo e esta ouvindo falar do EF agora eu recomendo que leia os artigos da seção Entity Framework do site.

Neste artigo eu quero  mostrar como o EF pode simplificar a vida do desenvolvedor mesmo em tarefas básicas e convencer assim quem ainda esta meio desconfiado com a ferramenta.

Vamos ao nosso caso...

Suponha que você tenha um pequeno sistema de vendas onde deve registrar os pedidos dos clientes.

Na interface da aplicação Windows Forms abaixo temos a estrutura básica para este aplicação que funciona da seguinte forma:

- Os clientes cadastrados são exibidos em um controle ListBox;

- Os produtos cadastrados são exibidos em um controle ComboBox;

- Para registrar o pedido de venda temos que selecionar um cliente e um produto;

- Os dados do cliente (nome,endereço) e do produto (preço) são exibidos automaticamente nos controles TextBox;

- Resta informar a quantidade e data do pedido e acionar o botão: Confirmar Pedido para registrar o pedido de venda;

É um cenário simples mas que envolve alguns procedimentos padrão como :

Se você já realizou algumas destas tarefas básicas usando ADO .NET sabe que terá que seguir diversos passos como definir os objetos para conexão e persistência no banco de dados como : DataAdapter, DataSet, DataTable, Connection, comandos SQL , etc...

Apenas para recordar veja abaixo um trecho de código geralmente usado para este tipo de tarefa:

Dim conexaoString As String ="server=(local)\SQLEXPRESS;integrated security=sspi;database=NomeBancoDados"

Dim comandoSQL As String = "Select campo1,campo2, ... from Tabela"
Dim da As New SqlDataAdapter(commandString, connectionString)
Dim ds As New DataSet( )

da.Fill(ds, "tabela")
Dim dt As DataTable = ds.Tables(0)
 

Vou mostrar que usando o Entity Framework(EF) você não vai precisar ter que se preocupar mais com esses detalhes deixando tudo isso a cargo da ferramenta ORM.

Para este exemplo eu crie um modelo de dados básico baseado no banco de dados Northwind.mdf que você vê abaixo:

 O modelo de dados ao lado consiste das seguintes tabelas:

 - Tabela Clientes
 - Tabela Produtos
 - Tabela Pedidos
 - Tabela Detalhes(dos pedidos)

Cada tabela possui uma chave primária do tipo identity definida e no modelo podemos identificar os seguintes relacionamentos:

-  Clientes -> Pedidos : Um-para-Muitos
-  Produtos -> Pedidos : Muitos- para-Muitos
 

Foi criado o banco de dados JcmSoft.mdf  e as tabelas acima usando o SQL Server 2005 Express Edition.

Eu vou usar o Visual Studio 2010 para criar o projeto Windows Forms e usar o Entity Framework.

Vamos criar uma solução com dois projetos: o projeto chamado Persistencia onde teremos o Entity Data Model e o projeto Windows Forms: WF_Operacoes_BD,  dessa forma estamos criando uma camada de acesso e persistência usando o Entity Framework.

Abra o VS 2010 e no menu File->New Project selecione Other Project Types ->Visual Studio Solutions e o template Blank Solution informando o nome ef4_Operacoes_BD;

Agora vamos criar o projeto Persistencia; clique com o botão direito sobre o nome da Solução e selecione Add -> New Project e a seguir selecione Other Languages -> Visual C# e o template Class Library informando o nome Persistencia e clicando em OK;

O próximo passo é criar o nosso modelo de entidades baseado no modelo de dados que já temos criado. Para isso devemos criar Entity Data Model (EDM) ou modelo de entidades de dados e pode ser considerado o coração da do Entity Framework.

O EDM é um modelo entidades - relacionamentos onde :
  • Entidades - são instâncias de tipos de entidades como Clientes, Produtos os quais estão estruturados em registros e chaves;
  • Relacionamentos - são instâncias de tipos de relacionamentos que são associações entre duas ou mais tipos de entidades;

É a partir do modelo de entidades que podemos escrever código usando as diferentes APIs , como o provedor EntityClient ou o Object Services com LINQ to Entities do Entity Framework.

Para isso clique com o botão direito sobre o projeto Persistencia e selecione Add -> New Item e a seguir selecione no item Data a opção ADO .NET Entity Data Model e informe o nome JcmSoft.edmx e clique em Add;

O arquivo edmx é um arquivo XML que contém o mapeamento para o nosso modelo físico. Ele é composto por três arquivos internos que são desmembrados em tempo de execução :

Na tabela abaixo temos a descrição de cada uma das partes de um arquivo EDMX:

SSDL (Storage Model)  Descreve o banco de dados no qual estaremos trabalhando os dados.
CSDL (Conceptual Model)  Descreve os nossos objetos no modelo, sejam entidades, tipos complexos, navigation properties.
MSL (Mapping Model)  Descreve o mapeamento objeto-relacional (ORM), para que o SSDL e o CSDL possam se relacionar corretamente.

O assistente Entity Data Model irá surgir, selecione a opção Generate From DataBase e clique em Next>;

Na próxima janela seleciona a conexão com o banco de dados do modelo que nosso caso é o banco de dados JcmSoft;

Aceite o nome para entity connection : JcmSoftEntities e clique em Next>;

Para encerrar selecione as tabelas do banco de dados e marque a opção Pluralize or singularize generated object names , aceite o nome para modelo e clique en Finish;

Obs: A opção  Pluralize or singularize generated object names é uma novidade da nova versão do EF.

Ao final você verá o modelo de entidades gerado onde cada entidade esta mapeada para uma tabela no banco de dados, conforme a figura abaixo onde o mapeamento ORM já foi efetuado permitindo que a partir de agora possamos trabalhar com entidades e objetos em nosso objeto abstraindo assim o tratamento da  conexão, objetos de acesso a dados e comandos SQL;

Nosso modelo de entidades apresenta o nome da Entidade, Properties e Navigation Properties onde;

  1. Nome da Entidade (Ex:Cliente) : é o nome da nossa entidade e também o nome da classe como vamos usar em nosso código;
  2. Properties: São as colunas da tabela no banco de dados. As propriedades tem duas nomenclaturas : as Scalar Properites, que são as colunas em si na forma escalar (string, int, double, etc.), e as Complex Types; Um Complex Type pode ser uma classe que representa um produto;
  3. Navigation Properties: São as estruturas que vão representar os relacionamentos do nosso banco de dados e que permitem navegar pelas entidades;

Se você abrir o arquivo App.Config do projeto irá notar que a string de conexão foi gravada na seção connectionStrings:

Embaixo, podemos notar o nome da connection string no arquivo App.config

<?xml version="1.0" encoding="utf-8"?>
<
configuration>
<
connectionStrings>
<
add name="JcmSoftEntities" connectionString="metadata=res://*/JcmSoft.csdl|res://*/JcmSoft.ssdl|res://*/JcmSoft.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=MAC-PC\SQLEXPRESS;Initial Catalog=JcmSoft;Integrated Security=True;Pooling=False;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />
</
connectionStrings>
</
configuration>

Vamos agora criar o projeto Windows Forms; clique com o botão direito sobre o nome da Solução e selecione Add -> New Project e a seguir selecione Other Languages -> Visual C# e o template Windows Forms Application informando o nome WF_Operacoes_BD e clicando em OK;

Antes de continuar precisamos copiar o arquivo App.Config do projeto Persistencia para o projeto WF_Operacoes_BD;

Precisamos também incluir uma referência a biblioteca System.Data.Entity no projeto WF_Operacoes_BD;

Após realizar estas tarefas teremos na janela Solution Explorer A solução exibindo os dois projetos onde o projeto Windows Forms deverá conter a referência a System.Data.Entity e o arquivo App.Config

Para encerrar a primeira parte deste artigo vamos definir também o  leiaute da interface no formulário padrão form1.cs usando os controles ListBox, TextBox, ComboBox, NumericaUpDown e DateTImePicker conforme a figura abaixo:

E com isso criamos toda a infra-estrutura e estamos pronto para efetivamente realizar o acesso e a persistência de dados, e iremos fazer isso trabalhando com objetos e não diretamente com o modelo conceitual da aplicação sem fazer o acesso direto ao banco de dados.

Aguarde a segunda parte no artigo: Entity Framework 4 - Operações básicas de acesso a dados - 2

Eu sei é apenas Entity Framework mas eu gosto...

Referências:


José Carlos Macoratti