1. Introdução
1.1. Objetivo
O PDF do documento está disponível |AQUI|.
Os exemplos no documento estão disponíveis |AQUI|.
O Entity Framework é um ORM (Object Relational Mapper) originalmente criado pela Microsoft e agora disponível como código aberto [julho de 2012, http://entityframework.codeplex.com/]. Num curso de ASP.NET, utilizo a seguinte arquitetura para uma determinada aplicação web:
![]() |
O framework NHibernate [http://sourceforge.net/projects/nhibernate/] é um ORM anterior ao Entity Framework. É 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 comandos SQL para o conector. A camada [DAO], por sua vez, utiliza a interface fornecida pelo ORM. Esta interface depende do ORM. Portanto, alterar o ORM requer a alteração da camada [DAO].
Esta arquitetura é resiliente a alterações no SGBD.
Quando a camada [DAO] está ligada diretamente ao conector ADO.NET, a alteração do SGBD afeta a camada [DAO]:
- nem todos os SGBDs têm os mesmos tipos de dados;
- os SGBDs não utilizam as mesmas estratégias para gerar chaves primárias;
- os SGBDs utilizam SQL proprietário;
- a camada [DAO] pode ter utilizado bibliotecas ligadas a um SGBD específico;
- ...
Quando um ORM está ligado ao conector ADO.NET, a mudança de SGBD envolve simplesmente configurar o ORM para se adaptar ao novo SGBD. A camada [DAO] permanece inalterada.
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 uma referência à camada [DAO] ao Spring;
- o Spring utiliza um ficheiro de configuração para criar esta camada e devolver a referência.
Esta arquitetura lida bem com alterações de camadas, desde que as camadas continuem a expor a mesma interface. Alterar a camada [DAO] acima envolve modificar o ficheiro de configuração do Spring para que a nova camada seja instanciada no lugar da antiga. Uma vez que ambas as camadas implementam a mesma interface e a camada ASP.NET utiliza esta interface, a camada ASP.NET permanece inalterada.
Temos, portanto, aqui uma arquitetura flexível e escalável. Para demonstrar isto, iremos substituir o ORM NHibernate pelo Entity Framework 5:
![]() |
Vamos proceder em várias etapas:
- vamos explorar o Entity Framework 5 com vários SGBDs;
- vamos construir a camada [DAO2];
- vamos ligar a aplicação ASP.NET existente a esta nova camada [DAO].
1.2. Ferramentas utilizadas
Os testes foram realizados num portátil HP EliteBook com o Windows 7 Pro, equipado com um processador Intel Core i7 e 8 GB de RAM. Utilizaremos C# como linguagem de programação.
Este documento utiliza as seguintes ferramentas, todas disponíveis gratuitamente:
IDE de desenvolvimento:
- Visual Studio Express for Desktop 2012 [http://www.microsoft.com/visualstudio/fra/downloads];
- Visual Studio Express for 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 for 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 for 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 for 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 for InterBase/Firebird Freeware [http://www.sqlmanager.net/fr/products/ibfb/manager/download].
LINQPad 4: uma ferramenta para aprender LINQ (Language INtegrated Query) [http://www.linqpad.net/, http://www.linqpad.net/GetFile.aspx?LINQPad4.zip].
1.3. Código-fonte
O código-fonte dos exemplos que se seguem está disponível |AQUI|.
![]() |
Trata-se de projetos do Visual Studio 2012 [1], agrupados numa solução [2]. Na pasta [databases], existe uma pasta para cada SGBD utilizado. Estas pastas contêm os scripts SQL para gerar a base de dados de exemplo para esses SGBDs.
1.4. A Abordagem
Para aprender sobre o Entity Framework 5 Code First, comecei com o seguinte livro: «Professional ASP.NET MVC 3», de Jon Galloway, Phil Haack, Brad Wilson e Scott Allen, publicado pela Wrox. Na aplicação de exemplo do livro, os autores utilizam o Entity Framework (EF) como ORM. Como não estava familiarizado com ele, pesquisei na Internet para saber mais. Descobri que a versão mais recente era o EF 5 e que havia incompatibilidades com o EF 4, uma vez que o código do livro, quando testado com o EF 5, produzia erros de compilação.
Descobri então que existem várias formas de utilizar o EF:
- Model First: Existem muitos artigos sobre esta abordagem ao EF, por exemplo [http://msdn.microsoft.com/en-us/data/ff830362.aspx]. Este artigo começa da seguinte forma:
Resumo: Neste artigo, vamos analisar o novo Entity Framework 4 que vem com o .NET Framework 4 e o Visual Studio 2010. Vou discutir como pode abordar a sua utilização numa perspetiva «Model First», partindo do princípio de que pode orientar o desenho da base de dados a partir de um modelo e construir tanto a sua base de dados como a sua 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 e 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 as tabelas da base de dados e as classes.
![]() |
Acima,
- à esquerda da camada EF5, temos objetos, aos quais chamamos entidades;
- à direita da camada EF5, temos tabelas de base de dados.
![]() |
A camada [DAO] trabalha com objetos que representam tabelas de base de dados. Estes objetos estão agrupados num contexto de persistência e são chamados de entidades (Entity). As alterações feitas nas entidades são refletidas, através do ORM, nas tabelas da base de dados (inserção, modificação, eliminação). Além disso, a camada [DAO] utiliza uma linguagem de consulta chamada LINQ to Entities (Language-Integrated Query) que consulta entidades em vez de tabelas. A abordagem Model-First envolve a construção de entidades utilizando uma ferramenta gráfica. Define-se cada entidade e as relações que a ligam às outras. Uma vez feito isto, a ferramenta gera:
- as várias classes que refletem as entidades criadas graficamente;
- a DDL (Data Definition Language) utilizada para gerar a base de dados.
Todos os exemplos que encontrei para este método utilizavam 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 para este método é uma base de dados existente. A partir daí, uma ferramenta gera automaticamente os modelos de entidade para as tabelas da base de dados. Mais uma vez, os exemplos que encontrei, como [http://msdn.microsoft.com/en-us/data/gg685489.aspx], utilizam o Visual Studio 2010 Professional e o ADO.NET Entity Data Model. Por isso, também abandonei esta abordagem, apesar de ser a minha favorita. Para determinar quais as entidades a utilizar como representações de uma base de dados existente, foi fácil começar com uma ferramenta que as gera.
- Code First: escreve-se as próprias classes que formarão as entidades. Isto requer, pelo menos, um conhecimento básico de como o EF funciona. Esta foi a abordagem que adotei porque era compatível com o Visual Studio Express 2012.
Tendo isso em mente, trabalhei da seguinte forma:
- Escrevi código para o SQL Server Express 2012, porque esse é o SGBD para o qual existem mais exemplos disponíveis;
- assim que este código foi depurado, portei-o para os outros SGBDs (Firebird, Oracle, MySQL, PostgreSQL).
Aqui, vamos proceder de forma diferente. Primeiro, vou descrever todo o código para o SQL Server e, em seguida, vou descrever como foi portado para os outros SGBDs. Neste processo de portabilidade, foram feitos os seguintes ajustes:
- os bancos de dados possuem características próprias. Em particular, utilizei gatilhos para gerar automaticamente o conteúdo de determinadas colunas. Cada SGBD tem a sua própria forma de lidar com isso;
- as entidades de imagem nas tabelas podem mudar, mas isso é intencional. Eu poderia ter escolhido entidades adequadas para todas as bases de dados;
- o controlador ADO.NET para o SGBD muda;
- a cadeia de ligação ao SGBD muda.
A abordagem adotada é a seguinte:
- mapeamento de entidade/base de dados. Preenchimento da base de dados;
- Exportação do banco de dados usando consultas LINQ;
- LINQPad, uma ferramenta para aprender LINQ;
- Adicionar, eliminar e modificar entidades;
- gestão do acesso simultâneo;
- Contexto de persistência guardado dentro de uma transação;
- Modificar uma entidade fora do contexto de persistência;
- Carregamento antecipado e diferido;
- Construção da camada [DAO];
- Construção da camada web ASP.NET.
1.5. Público-alvo
Este documento destina-se a principiantes.
Este documento não é um curso sobre o Entity Framework 5 Code First. Para isso, poderá querer ler, por exemplo, «Programming Entity Framework: Code First», de Julie Lerman e Rowan Miller, publicado pela O'Reilly. Este documento não pretende ser exaustivo, mas apenas descreve a abordagem que utilizei para compreender este ORM. Acredito que esta abordagem possa ser útil para outras pessoas que trabalham com o EF5. O meu objetivo não vai além deste âmbito.
1.6. Artigos relacionados em developpez.com
O livro acima citado servirá de referência. Existem também 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 sobrepõem-se em parte. No entanto, ele aprofunda-se em determinados pontos, particularmente no que diz respeito ao "mapeamento" da herança de classes <--> tabelas;
- «Introdução ao Entity Framework», dezembro de 2008, por Paul Musso;
- «Criação de um modelo de classes com o Entity Framework», abril de 2009, por Jérôme Lambert;
- «Medição de desempenho do Linq to SQL em comparação com o SQL e o Entity Framework», junho de 2011, por Immobilis;
- «Entity Framework Code First: Ativação da Migração Automática», junho de 2012, por Hinault Romaric;
- "Criação de uma aplicação CRUD com WebMatrix, Razor e Entity Framework", maio de 2012, por Hinault Romaric;
- "Entity Framework: Explorando as Migrações Code First", junho de 2012, por Hinault Romaric;
Conforme referido acima, este documento não é exaustivo. Os leitores beneficiarão da consulta dos artigos acima referidos para colmatar certas lacunas. A minha pesquisa pode ter ficado incompleta. Peço desculpa a quaisquer autores que possa ter esquecido.




