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) criado inicialmente pela Microsoft e agora disponível como código aberto [juillet 2012, http://entityframework.codeplex.com/]. Em um 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 conectar-se a diversos bancos de dados. O ORM isola a camada [DAO] (Data Access Objects) do conector ADO.NET. É o ORM que emite os comandos SQL destinados ao conector. A camada [DAO], por sua vez, utiliza a interface oferecida pelo ORM. Esta, por sua vez, depende do ORM. Assim, alterar o ORM implica alterar a camada [DAO].

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

Quando se conecta a camada [DAO] diretamente ao conector ADO.NET, a alteração do SGBD afeta a camada [DAO]:

  • nem todas as camadas SGBD possuem os mesmos tipos de dados;
  • os SGBD não possuem 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 vinculadas a um SGBD específico;
  • ...

Quando é um ORM que está conectado ao conector ADO.NET, alterar o SGBD equivale a alterar a configuração do ORM para adaptá-la ao novo SGBD. A camada [DAO] não sofre alterações.

O framework Spring.NET [http://www.springframework.net/index.html] garante 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 arquivo de configuração para criar essa camada e retornar a referência a ela.

Essa arquitetura se adapta bem às mudanças nas camadas, desde que estas mantenham sempre a mesma interface. Alterar a camada [DAO] acima consiste em modificar o arquivo de configuração do Spring para que a nova camada seja instanciada no lugar 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 escalável. Para demonstrar isso, 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 conectar o aplicativo ASP.NET existente a essa nova camada [DAO].

1.2. As ferramentas utilizadas

Os testes foram realizados em um laptop HP EliteBook com Windows 7 Pro, um processador Intel Core i7 e 8 GB de RAM. Usaremos C# como linguagem de desenvolvimento.

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

Ferramentas de desenvolvimento:

  • Visual Studio Express para Desktop 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 Release 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 Oracle Developer Tools para 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 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 de Consulta INtegrated) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].

1.3. Os códigos-fonte

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

Trata-se de projetos do Visual Studio 2012 [1], agrupados em uma solução [2]. Em uma pasta [databases], há uma pasta para cada SGBD utilizado. Nela estão os scripts SQL para geração do banco de dados de exemplo para esses SGBD.

1.4. O método

Para conhecer o Entity Framework 5 Code First, comecei lendo o seguinte livro: “Professional ASP.NET MVC 3”, de Jon Galloway, Phil Haack, Brad Wilson e Scott Allen, publicado pela editora Wrox. No aplicativo de exemplo desse livro, os autores utilizam o Entity Framework (EF) como ORM. Como eu não conhecia, pesquisei na internet para saber mais. Descobri, então, que a versão mais recente era o EF 5 e que havia incompatibilidades com o EF 4, pois o código do livro, quando testado com o EF 5, apresentava erros de compilação.

Em seguida, descobri que havia várias maneiras de usar o EF:

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

Resumo: Neste artigo, analisaremos o novo Entity Framework 4, que vem junto com o .NET Framework 4 e o Visual Studio 2010. Discutirei como você pode abordar seu uso a partir de uma perspectiva “model first”, partindo da premissa de que é possível orientar o projeto do banco de dados a partir de um modelo e construir tanto o banco de dados quanto a camada de acesso aos dados de forma declarativa a partir desse modelo. O modelo contém a descrição dos dados representados como entidades e relações, proporcionando uma abordagem poderosa para trabalhar com o ADO.NET, criando uma separação de interesses por meio de uma abstração entre a definição do modelo e sua implementação.

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

Acima,

  • à esquerda da camada EF5, temos objetos, chamados de entidades;
  • à direita da camada EF5, temos tabelas de banco de dados.

A camada [DAO] trabalha com objetos de imagem das tabelas do banco de dados. Esses objetos são agrupados em um contexto de persistência e são chamados de entidades (Entity). As alterações feitas nas entidades são refletidas, por meio da camada ORM, nas tabelas do banco de dados (inserção, modificação, exclusão). Além disso, a camada [DAO] dispõe de uma linguagem de consulta LINQ to Entity (Language INtegrated Query) que realiza consultas nas entidades e não nas 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 isso, uma ferramenta permite gerar:

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

Os exemplos que encontrei sobre esse método utilizavam, todos, o Visual Studio 2010 Professional e um modelo chamado ADO.NET Entity Data Model. Consegui testar esse modelo com o Visual Studio 2010 Professional, mas quando mudei para o Visual Studio Express 2012, que era meu objetivo, constatei que esse modelo não estava mais disponível. Por isso, desisti dessa abordagem.

  • Database First: o ponto de partida desse método é um banco de dados existente. A partir daí, uma ferramenta gera automaticamente as entidades que representam as tabelas do banco de dados. Mais uma vez, os exemplos encontrados, como 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 abandonando também essa abordagem, que, no entanto, era a minha preferida. Para saber quais entidades usar como representações de um banco de dados existente, era simples começar com uma ferramenta que as gerasse.
  • Code First: escrevemos nós mesmos as classes que formarão as entidades. É necessário, então, ter um mínimo de conhecimento sobre o funcionamento do EF. Esse foi o caminho que segui porque era viável com o Visual Studio Express 2012.

Com isso resolvido, trabalhei da seguinte maneira:

  • escrevia um código para o SQL Server Express 2012, pois é para essa versão que se encontram a maioria dos exemplos;
  • depois de depurar esse código, eu o portava para os outros SGBD (Firebird, Oracle, MySQL, PostgreSQL).

Aqui, vamos proceder de maneira diferente. Primeiro, descreverei todos os códigos para o SQL Server e, em seguida, descreverei sua adaptação para os outros SGBD. Nessa adaptação, são realizados os seguintes ajustes:

  • os bancos de dados possuem características específicas do fabricante. Utilizei, notadamente, Triggers para gerar o conteúdo de certas colunas automaticamente. Cada SGBD tem sua própria maneira de lidar com isso;
  • as entidades de imagem nas tabelas podem mudar, mas isso é intencional. Eu poderia ter escolhido entidades adequadas para todos os bancos de dados;
  • o driver ADO.NET do SGBD é alterado;
  • A cadeia de conexão ao SGBD é alterada.

O procedimento adotado é o seguinte:

  • associação de entidades à base de dados. Preenchimento da base de dados;
  • exportação do banco de dados com consultas LINQ;
  • LINQPad, uma ferramenta de aprendizagem do LINQ;
  • adição, exclusão e modificação de entidades;
  • gerenciamento de concorrência de acesso;
  • contexto de persistência salvo em uma transação;
  • modificaçã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 iniciantes.

Este documento não é um curso sobre o Entity Framework 5 Code First. Para isso, 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 tem a pretensão de ser exaustivo, mas simplesmente expõe a abordagem que utilizei para compreender este ORM. Acredito que essa abordagem possa ser útil para outras pessoas que estejam se familiarizando com o EF5. Meu objetivo não vai além disso.

1.6. Artigos relacionados sobre developpez.com

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

Conforme indicado acima, o presente documento não é exaustivo. Recomenda-se a leitura dos artigos acima para preencher algumas lacunas. Minha pesquisa pode ter sido incompleta. Peço desculpas aos autores que eu possa ter esquecido.