Skip to content

1. Introdução

1.1. Objectif

O PDF do documento está disponível |AQUI|.

Os exemplos do documento estão disponíveis |AQUI|.

O Entity Framework é um ORM (Mapeador Objeto-Relacional) inicialmente criado pela Microsoft e agora disponível em código aberto [juillet 2012, http://entityframework.codeplex.com/]. Num curso ASP.NET, utilizo a seguinte arquitetura para uma determinada aplicação web:

O framework NHibernate [http://sourceforge.net/projects/nhibernate/] é um ORM que surgiu antes do Entity Framework. Trata-se de um produto maduro que permite ligar-se a várias bases de dados. O ORM isola a camada [DAO] (Data Access Objects) do conector ADO.NET. É o ORM que emite as ordens SQL destinadas ao conector. A camada [DAO], por sua vez, utiliza a interface disponibilizada pelo ORM. Esta depende do ORM. Assim, alterar o ORM implica alterar a camada [DAO].

Esta arquitetura resiste bem às alterações no SGBD.

Quando se liga a camada [DAO] diretamente ao conector ADO.NET, a alteração do SGBD tem impacto na camada [DAO]:

  • nem todas as camadas SGBD têm os mesmos tipos de dados;
  • os SGBD não têm as mesmas estratégias de geração de chaves primárias;
  • os SGBD contêm SQL proprietário;
  • a camada [DAO] pode ter utilizado bibliotecas associadas a um SGBD específico;
  • ...

Quando é um ORM que está ligado ao conector ADO.NET, alterar o SGBD equivale a alterar a configuração do ORM para o adaptar ao novo SGBD. A camada [DAO] não se altera.

O framework Spring.NET [http://www.springframework.net/index.html] assegura a integração das camadas de uma aplicação. Acima:

  • a aplicação ASP.NET solicita ao Spring uma referência à camada [DAO];
  • o Spring utiliza um ficheiro de configuração para criar essa camada e fornecer a referência à mesma.

Esta arquitetura adapta-se bem às alterações nas camadas, desde que estas continuem a apresentar a mesma interface. Alterar a camada [DAO] acima consiste em alterar o ficheiro de configuração do Spring para que a nova camada seja instanciada em vez da antiga. Como ambas implementam a mesma interface e a camada ASP.NET utiliza essa interface, a camada ASP.NET permanece inalterada.

Temos, portanto, uma arquitetura flexível e evolutiva. Para o demonstrar, vamos substituir a camada ORM pela camada NHibernate do Entity Framework 5:

Vamos proceder em várias etapas:

  • vamos explorar o Entity Framework 5 com vários SGBD;
  • vamos construir a camada [DAO2];
  • vamos ligar a aplicação ASP.NET existente a esta nova camada [DAO].

1.2. As ferramentas utilizadas

Os testes foram realizados num portátil HP EliteBook com Windows 7 Pro, um processador Intel Core i7 e 8 GB de RAM. Utilizaremos C# como linguagem de desenvolvimento.

O documento utiliza as seguintes ferramentas, todas disponíveis gratuitamente:

Ferramentas de desenvolvimento:

  • Visual Studio Express para o Office 2012 [http://www.microsoft.com/visualstudio/fra/downloads];
  • Visual Studio Express para a Web 2012 [http://www.microsoft.com/visualstudio/fra/downloads].

O SGBD SQL Server Express 2012:

  • o SGBD: [http://www.microsoft.com/fr-fr/download/details.aspx?id=29062];
  • uma ferramenta de administração: EMS SQL Manager para o SQL Server Freeware [http://www.sqlmanager.net/fr/products/mssql/manager/download].

O SGBD Oracle Database Express Edition 11g Versão 2:

  • o SGBD: [http://www.oracle.com/technetwork/products/express-edition/downloads/index.html];
  • uma ferramenta de administração: EMS SQL Manager for Oracle Freeware [http://www.sqlmanager.net/fr/products/oracle/manager/download];
  • um cliente Oracle para .NET: ODAC 11.2 Release 5 (11.2.0.3.20) com as Ferramentas de Desenvolvimento Oracle para o Visual Studio: [http://www.oracle.com/technetwork/developer-tools/visual-studio/downloads/index.html].

O SGBD MySQL 5.5.28:

  • o SGBD: [http://dev.mysql.com/downloads/];
  • uma ferramenta de administração: EMS, SQL Manager para MySQL, Freeware [http://www.sqlmanager.net/fr/products/mysql/manager/download].

O SGBD PostgreSQL 9.2.1:

  • o SGBD: [http://www.enterprisedb.com/products-services-training/pgdownload#windows];
  • uma ferramenta de administração: EMS SQL Manager para o PostgreSQL Freeware [http://www.sqlmanager.net/fr/products/postgresql/manager/download].

O SGBD Firebird 2.1:

  • o SGBD: [http://www.firebirdsql.org/en/firebird-2-1-5/];
  • uma ferramenta de administração: EMS SQL Manager para InterBase/Firebird Freeware [http://www.sqlmanager.net/fr/products/ibfb/manager/download].

LINQPad 4: uma ferramenta de aprendizagem do LINQ (Linguagem INtegrated Query) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].

1.3. Os códigos-fonte

Os códigos-fonte dos exemplos que se seguem estão disponíveis no URL [http://tahe.developpez.com/dotnet/ef5cf].

Trata-se de projetos do Visual Studio 2012 [1], reunidos numa solução [2]. Numa pasta [databases], encontrará-se uma pasta por cada SGBD utilizado. Nela encontram-se os scripts SQL para a geração da base de dados de exemplo para estes SGBD.

1.4. O método

Para descobrir o Entity Framework 5 Code First, comecei por consultar o seguinte livro: «Professional ASP.NET MVC 3», de Jon Galloway, Phil Haack, Brad Wilson e Scott Allen, publicado pela editora Wrox. Na aplicação de exemplo deste livro, os autores utilizam o Entity Framework (EF) como ORM. Como não o conhecia, pesquisei na Internet para saber mais. Descobri assim que a versão mais recente era a EF 5 e que havia incompatibilidades com a EF 4, uma vez que o código do livro, testado com a EF 5, apresentava erros de compilação.

Descobri então que havia várias formas de utilizar o EF:

  • Model First: existem muitos artigos sobre esta abordagem do EF, por exemplo, o [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. Este artigo é introduzido da seguinte forma:

Resumo: Neste artigo, iremos analisar o novo Entity Framework 4, que vem integrado no .NET Framework 4 e no Visual Studio 2010. Irei discutir como pode abordar a sua utilização numa perspetiva «model first», partindo do princípio de que é possível orientar o desenho da base de dados a partir de um modelo e construir tanto a base de dados como a camada de acesso aos dados de forma declarativa a partir desse modelo. O modelo contém a descrição dos seus dados representados como entidades e relações, proporcionando uma abordagem poderosa para trabalhar com o ADO.NET, criando uma separação de preocupações através de uma abstração entre a definição do modelo e a sua implementação.

Um ORM faz a ponte entre tabelas de bases de dados e classes.

Acima,

  • à esquerda da camada EF5, temos objetos, a que chamamos entidades;
  • à direita da camada EF5, temos tabelas de bases de dados.

A camada [DAO] trabalha com objetos de imagem das tabelas da base de dados. Estes objetos são agrupados num contexto de persistência e são designados por entidades (Entity). As alterações efetuadas nas entidades são refletidas, através da camada ORM, nas tabelas da base de dados (inserção, modificação, eliminação). Além disso, a camada [DAO] dispõe de uma linguagem de consulta LINQ to Entity (Language INtegrated Query) que efetua consultas sobre as entidades e não sobre as tabelas. O método Model First consiste em construir as entidades com uma ferramenta gráfica. Define-se cada entidade e as relações que a ligam às outras. Feito isto, uma ferramenta permite gerar:

  • as diferentes classes que refletem as entidades criadas graficamente;
  • o DDL (Linguagem de Definição de Dados) que permite gerar a base de dados.

Os exemplos que encontrei sobre este método utilizavam todos o Visual Studio 2010 Professional e um modelo denominado ADO.NET Entity Data Model. Consegui testar este modelo com o Visual Studio 2010 Professional, mas quando mudei para o Visual Studio Express 2012, que era o meu objetivo, verifiquei que este modelo já não estava disponível. Por isso, abandonei esta abordagem.

  • Database First: o ponto de partida deste método é uma base de dados existente. A partir daí, uma ferramenta gera automaticamente as entidades correspondentes às tabelas da base de dados. Mais uma vez, os exemplos que encontrei, como por exemplo o [http://msdn.microsoft.com/en-us/data/gg685489.aspx], utilizam o Visual Studio 2010 Professional e o modelo ADO.NET Entity Data Model. Por isso, acabei por abandonar também esta abordagem, que era, no entanto, a minha preferida. Para saber quais as entidades a utilizar como representações de uma base de dados existente, era simples começar com uma ferramenta que as gerasse.
  • Code First: escrevemos nós próprios as classes que irão formar as entidades. É necessário, então, ter um mínimo de conhecimentos sobre o funcionamento do EF. Foi este o caminho que segui, porque era compatível com o Visual Studio Express 2012.

Uma vez adquirido este conhecimento, trabalhei da seguinte forma:

  • escrevia código para o SQL Server Express 2012, pois é para esta versão que se encontram a maioria dos exemplos;
  • assim que esse código estava depurado, portava-o para os outros SGBD (Firebird, Oracle, MySQL, PostgreSQL).

Aqui, vamos proceder de forma diferente. Primeiro, vou descrever todos os códigos para o SQL Server e, em seguida, descreverei a sua adaptação para os outros SGBD. Nesta adaptação, são efetuados os seguintes ajustes:

  • as bases de dados têm características específicas próprias. Em particular, utilizei «Triggers» para gerar automaticamente o conteúdo de certas colunas. Cada SGBD tem a sua própria forma de gerir isto;
  • as entidades de imagem das tabelas podem mudar, mas isso é intencional. Poderia ter escolhido entidades adequadas a todas as bases de dados;
  • o controlador ADO.NET do SGBD altera-se;
  • A cadeia de ligação ao SGBD altera-se.

O procedimento adotado é o seguinte:

  • associação de entidades à base de dados. Preenchimento da base de dados;
  • exportação da base de dados com consultas LINQ;
  • LINQPad, uma ferramenta de aprendizagem do LINQ;
  • adição, eliminação e modificação de entidades;
  • gestão da concorrência de acesso;
  • contexto de persistência guardado numa transação;
  • alteração de uma entidade fora do contexto de persistência;
  • Carregamento antecipado (Eager) e diferido (Lazy);
  • construção da camada [DAO];
  • construção da camada web ASP.NET.

1.5. Público-alvo

O público-alvo são os principiantes.

Este documento não é um curso sobre o Entity Framework 5 Code First. Para tal, pode-se ler, por exemplo, «Programming Entity Framework: Code First», de Julie Lerman e Rowan Miller, publicado pela editora O'Reilly. O documento não pretende, de forma alguma, ser exaustivo, mas expõe simplesmente a abordagem que utilizei para compreender este ORM. Penso que esta abordagem pode ser útil para outras pessoas que se estejam a iniciar no EF5. O meu objetivo não vai além deste âmbito.

1.6. Artigos relacionados sobre o developpez.com

O livro acima referido servirá de referência. Existem, além disso, artigos dedicados ao Entity Framework no developpez.com. Aqui estão alguns deles:

Conforme referido anteriormente, o presente documento não é exaustivo. Recomenda-se a leitura dos artigos acima referidos para colmatar algumas lacunas. A minha pesquisa pode ter ficado incompleta. Peço desculpa aos autores que possa ter esquecido.