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:
- “Entity Framework – a abordagem Code First”, junho de 2012 – por Reward. Este artigo e o presente documento se sobrepõem parcialmente. No entanto, ele se aprofunda em alguns pontos, especialmente no “mapeamento” de herança entre classes <--> tabelas;
- “Introdução ao Entity Framework”, dezembro de 2008, por Paul Musso;
- “Criando um modelo de classes com o Entity Framework”, abril de 2009, por Jérôme Lambert;
- “Avaliação do desempenho do Linq to SQL em comparação com o SQL e o Entity Framework”, junho de 2011, da Immobilis;
- "Entity Framework Code First: ativar a migração automática", junho de 2012, por Hinault Romaric;
- “Criação de um aplicativo CRUD com WebMatrix, Razor e Entity Framework”, maio de 2012, por Hinault Romaric;
- “Entity Framework: uma introdução às migrações Code First”, junho de 2012, por Hinault Romaric;
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.




