27
Entity Framework 4 – Model First com POCOs
Filed Under (.NET, .NET 4.0, Boas Práticas, Entity Framework, Visual Studio 2010) by Vinicius Quaiato on 27-01-2010
Tagged Under : Entity Framework, ORM, VS2010
Fala galera, de buenas? Resolvi escrever um pouco sobre o Entity Framework 4.0 (na verdade é a versão 2 do EF mas para acompanhar o .NET 4.0 ele será chamado assim também).
Hoje vou mostrar uma característica bem interessante, que é o model first trabalhando com POCOs.
Model First diz respeito a primeiro criar suas entidades, ou seja, suas classes, e somente depois modelar o banco de dados – e é isto que queremos fazer quando desenvolvemos aplicações usando Orientação a Objetos, não é?
POCOs são classes simples, que não herdam nem implementam nenhuma outra classes/interface específica de frameworks, dizendo respeito exclusivamente ao nosso domínio e contendo apenas o necessário ao nosso domínio.
Para começar vamos criar um projeto de testes e adicionar um arquivo .edmx como mostra a figura abaixo: Criando o arquivo edmx Selecionando o empty model

Feito isso vamos selecionar o tipo de modelo “empty model”:

Pronto! edmx com 2 entidades
Vamos então adicionar duas entidades ao nosso design surface. Estas serão nossas entidades POCO, ou seja, não terão nenhuma dependência do Entity Framework, nem do Linq, nem de nada, é apenas o nosso modelo de classes, vamos ainda desabilitar a geração de código do Visual Studio, para que ele não “polua” as classes:

E então clicamos na parte branca do design e abrimos a janela de propriedades para desabilitar a geração de código: desabilitando geração de código no EF 4.0

Estamos a meio caminho andado. Pode parecer muito trabalho a ser feito, mas isso não leva mais do que 2 minutos. É realmente simples e os resultados são muito bons.
Agora vamos para a parte bacana, codificar nossas classes.
Vamos iniciar codificando as classes Pedido e ItemPedido, que são classes realmente bastante simples:
public class Pedido { public virtual int Id { get; set; } private IList<ItemPedido> itens = new List<ItemPedido>(); public virtual IList<ItemPedido> Itens { get { return this.itens; } set { this.itens = value; } } } public class ItemPedido { public virtual int Id { get; set; } public virtual string Produto { get; set; } public virtual int Quantidade { get; set; } public virtual Pedido Pedido { get; set; } }
Os virtuais que usamos nas nossas classes são para que o Entity Framework possa fazer o “tracking” dos nossos objetos. Internamente ele criará proxies para nossas classes. Em um primeiro momento basta colocarmos as propriedades como virtual e ele se encarregará de tudo, isso ainda ajudará no Lazy Loading.
Agora, como desabilitamos a geração de código, precisamos também criar o nosso contexto do EF. Isso é bastante simples, e neste cenário nos obrigará a escrever apenas umas 10 linhas de código, como pode ser visto abaixo:
public class EF4Context : ObjectContext { public EF4Context() : base("name=EF4Container", "EF4Container") { } private IObjectSet<Pedido> pedidos; public IObjectSet<Pedido> Pedidos { get { if (pedidos == null) pedidos = CreateObjectSet<Pedido>(); return pedidos; } } }
Feito isso nos resta apenas gerar o banco de dados. Como dissemos, geramos primeiro nossas classes, sem nos preocupar em como estes dados seriam armazenados, conseguimos focar puramente no nosso domínio e no nosso modelo, afinal estamos pensando em classes e objetos, e não em linhas/tuplas de banco, chaves, índices, etc. gerar banco de dados usando o modelo do EF 4.0
O Visual Studio irá gerar o código necessário para nosso banco de dados veja abaixo:

Agora é só executar o SQL gerado: executando SQL gerado pelo EF 4.0

Se vocês fizeram tudo certinho até o momento, devem ser capazes de executar os seguintes códigos de testes com sucesso:
[TestMethod] public void Deve_Adicionar_Um_Pedido_No_DB_Usando_Contexto_E_Poco() { var contexto = new EF4Context(); var pedido = new Pedido(); pedido.Itens.Add(new ItemPedido { Produto = "Novo Produto", Quantidade = 5, Pedido = pedido }); contexto.AddObject("PedidoSet", pedido); contexto.SaveChanges(); }
Depois este:
[TestMethod] public void Deve_Obter_Todos_Os_Pedidos_Do_Banco_Usando_Contexto_E_Pocos() { var contexto = new EF4Context(); var pedidos = contexto.Pedidos.ToList(); Assert.IsTrue(pedidos.Count > 0); }
E por fim este:
1 2 3 4 5 6 7 8 9 10 11 12 13 | [TestMethod] public void Deve_Selecionar_1_Pedido_Do_Banco_Usando_Contexto_E_Pocos() { var contexto = new EF4Context(); contexto.ContextOptions.LazyLoadingEnabled = true; var pedido = contexto.Pedidos .Where(p => p.Id == 1).Single(); Assert.AreEqual(1, pedido.Id); Assert.IsTrue(pedido.Itens.Count > 0); Assert.AreEqual("Novo Produto", pedido.Itens[0].Produto); } |
Percebam como na linha 5 habilitamos o lazy loading para que as propriedades sejam carregadas no momento em que forem chamadas apenas.
E se fizermos uma consulta no banco de dados, veremos que de fato os dados estão lá: dados armazenados no banco pelo EF 4.0 usando Pocos

Bom pessoal, é isso.
Esta é uma das funcionalidades presentes no Entity Framework 4.0. É claro que existe muita coisa a ser explorada ainda, e existem muitas coisas a serem feitas ainda, mas é um enorme avanço poder trabalhar com POCOs e utilizar os recursos de uma ferrmenta ORM como o EF. Poder dar “tchau” para os SqlConnection, SqlCommand, ExecuteScalar, etc, é algo realmente incrível.
Espero que tenham gostado. Dúvidas, críticas e sugestões me enviem email ou comentários.
Abraços,
Vinicius Quaiato.
Related posts:
- Entity Framework 4.0: Utilizando many-to-many com POCOs Fala galera, recebi algumas dúvidas por e-mail e vamos resolver...
- Inversão de Controle (Inversion of Control / IoC) Fala galera, beleza? Escolhi falar de Inversão de Controle pois...
Olá Vinícius,
Muito bom este post. Você tem a intenção de testar o Model First com uma relação many-to-many?
Mas concordo. O EF agora está bem legal.
Você conhece providers gratuitos pra outros bancos de dados?
Abraços
Mário @mariomeyrelles
É isso ai Vinicius, gostei do post, ficou bem esclarecido! Patabéns pela iniciativa!
Parabéns ficou muito bom o post, cheguei a olhar bem pouco o EF mas não cheguei a fazer nenhuma aplicação e parece que o mesmo está agradando a todos. Bem ansioso para a versão final.
[...] This post was mentioned on Twitter by Vinicius Quaiato, Denis Petri. Denis Petri said: Uma amostra muito boa do EF4 com POCO http://tinyurl.com/yj7vbza Parabéns @vquaiato [...]
Fala Mário, beleza?
Confesso que ainda não procurei por providers para outros bancos.
Estou preparando um novo artigo sobre o EF 4.0 e tentarei colocar referência para providers(gratuitos) se eu encontrar.
E neste próximo post abordarei as relações entre os objetos (many-to-many, one-to-many, etc).
Abraços,
Vinicius Quaiato.
Bacana. Vale a pena ter um blog assim!
[...] Fala galera, recebi algumas dúvidas por e-mail e vamos resolver aqui. Vamos trabalhar com relações many-to-many utilizando POCO e o Entity Framework 4.0. Para ver como trabalhar com POCO no EF4 veja este post aqui. [...]
Parabéns pelo post Vinicius. Acho que eu diria até nunca mais SqlConnection, SqlCommand e cia limitada.
Obrigado Wallison e Denis.
Eu diria que a utilização do ADO.NET puro (SqlConnection etc) vai se dar em casos bastante isolados apenas. A tendência é utilizar ferramentas ORM, seja o EF4, NHibernate, etc.
Vamos ver como o mercado se comporta agora com o lançamento do EF4, que está bem mais maduro que o EF1.
Att,
Vinicius Quaiato.