PantaNet

Introdução ao ADO.NET Entity Framework 4.1

Recentemente foi lançada a versão final do Entity Framework 4.1, que é uma atualização para o Entity Framework 4.0 que acompanha o Visual Studio 2010 e pode ser baixado aqui .

 

Entre as novidades dessa atualização, destaca-se as seguintes:

 

DbContext API - Uma abstração simplicada sobre o ObjectContext e uma série de outros tipos que foram introduzidos nas versões anteriores do Entity Framework. A API do DbContext é otimizada para as tarefas mais comuns e foi desenhada para suportar alguns padrões de código muito comuns como "Repository Pattern" e "Unit Of Work Pattern". Pode ser tanto utilizado da maneira tradicional "Database First" em que o banco de dados já existe, "Model First" onde se cria o modelo conceitual que irá gerar o script para criação do banco de dados e a novidade desta versão que é o "Code First" onde classes "POCO" são mapeadas para as entidades.

 

Code First é um novo padrão de desenvolvimento incluído no Entity Framework 4.1 que provê uma alternativa para os padrões já existentes "Database First" e "Model First". O padrão "Code First" foca na modelagem baseada em classes planas que serão mapeadas a um banco de dados existente ou novo. As configurações adicionais podem ser fornecidas utilizando atributos "Data Anotations" ou via API fluente.

 

Nessa atualização, os seguintes recursos ainda não foram implementados e devemos aguardar as futuras versões:

 

* Suporte a ENUM

* Mapeamento de Stored Procedures (permite apenas invocá-las)

* Suporte a migração (geração de scripts para atualizar o banco de dados devido a alterações no modelo)

* Convenções customizadas para o "Code First".

 

Exemplo de utilização do EF 4.1 com Code First.

 

Trabalhar com Code First é muito simples. Vou ilustrar usando um cenário simples, onde possuímos 3 tabelas no banco de dados: Cidades, Estados, Paises e seus relacionamentos. Após isso vamos fazer algumas consultas e edições.

 

Após instalada a atualização (ver link no início do post), crie um novo projeto do tipo de sua preferência, no meu caso criei uma aplicação ASP.NET vazia. Será necessário adicionar as seguintes referências:

* System.ComponentModel.DataAnnotations

* EntityFramework (C:\Program Files\Microsoft ADO.NET Entity Framework 4.1\Binaries\EntityFramework.dll)

 

Crie uma nova pasta chamada Model e adicione as classes conforme código abaixo:

 

 

Observações: O Code-First utiliza algumas convenções para o mapeamento com o banco de dados. Por exemplo, toda a propriedade com o nome "Id" automaticamente é considerada o campo chave (Primary Key) no banco de dados. 

 

Na classe Cidade, temos uma propriedade do tipo virtual indicando que um tipo complexo (no caso Estado) tem um relacionamento por chave estrangeira (ForeignKey). O EF utilizará esta propriedade para "navegação", (Cidade.Estado.Nome).

 

Na classe Estado, temos uma propriedade virtual do tipo ICollection. Essa propriedade indica um relacionamento um-para-muitos (One-To-Many), ou seja, para cada Estado, há muitas cidades. Também possui uma propriedade complexa chamada Pais, para indicar o relacionamento entre o Estado e o País.

 

Na classe Pais, temos uma coleção de Estados.

 

Através de convenções, o EF realiza o mapeamento praticamente automático dos relacionamentos e propriedades de navegação.

 

Assim como no Entity Framework 4.0, para acessarmos o banco de dados é necessário utilizar um contexto. Um contexto é um objeto que agrupa várias entidades (tabelas). No caso do "Code First", precisamos criar uma classe que herda de "DbContext" e referenciar essas classes que criamos. Adicione mais uma classe conforme  a figura abaixo:

 

Nesse momento já possuímos um contexto para ser instanciado e utilizado dentro da aplicação. As propriedades públicas do tipo DbSet disponibilizam acesso às tabelas do banco de dados.

 

 

Um recurso interessante que encontramos no CodeFirst é o inicializador. Podemos criar uma classe para inicialização do banco de dados e definir se queremos excluí-lo e cria um novo, por exemplo, alimentando com algumas informações iniciais.

 

Acho interessante mostrar como funciona esse recurso agora, já que ainda não temos um banco de dados fisicamente criado. O EF irá criar um banco de dados novo em sua estação, de acordo com o nome que colocamos no construtor da classe de contexto, já que até esse ponto ainda não configuramos uma string de conexão no arquivo web.config.

 

E já que o banco de dados é novo, "zerado", sem registros, vamos alimentá-lo na sua inicialização.

Para isso, crie uma classe chamada MyInitializer conforme a figura mostrada abaixo:

 

Esta classe implementa uma interface do Entity Framework, chamada IDatabaseInitializer<T> em que passamos como parâmetro genérico a nossa classe "Context" que herdou de DbContext.

 

O local recomendado para instanciar esta classe é no arquivo Global.asax. Para isso, adicione este arquivo no projeto e faça conforme a figura abaixo:

 

Repare que criei um parâmetro do tipo bool no construtor da classe MyInitializer. Esse parâmetro, caso seja true, fará com que o banco de dados seja excluído caso exista, recriado novamente em seguida alimentado com alguns objetos (uma cidade, um estado e um país). Antes que a aplicação seja colocada em produção, obviamente esse parâmetro será falso. No nosso caso, como será a primeira execução da aplicação em que o banco de dados não existe, coloque como true.

 

Ao executar a aplicação web, nada será mostrado, apenas o banco de dados será criado.

Vamos criar uma página Default.aspx e colocar o seguinte código para testar.

 

Quando a página for carregada, será criado um novo contexto. Nesse momento o EF não gerou nenhuma consulta SQL. A consulta será realizada na linha a seguir, dentro do laço foreach, ao acessar a propriedade Cidades. Para fins de demonstração, apenas imprimi no Response da página o nome da cidade, que deverá ser "Campo Grande", conforme adicionamos na classe MyInitializer.

 

Conclusão

Nesse post, mostrei alguns recursos básicos na utilização do EF 4.1 Code First. Se o feedback for positivo, mostrarei num próximo post alguns exemplos de mapeamentos mais complexos, com relacionamentos um-para-um e muitos-para-muitos e mais exemplos de operações CRUD (Create, Update, Delete)

 

Para quem se interessar, o projeto usado neste post pode ser baixado no link abaixo.

 

.PostPantanetEf41.rar

Exibições: 3677

Tags: .NET, 4.1, ADO.NET, EF, Entity, Framework, POCO

Comentário de Jone em 19 abril 2011 às 21:06

Para quem tiver problemas ao tentar baixar o projeto pelo link fornecido no post, aqui vai um link alternativo.

 

http://dl.dropbox.com/u/14150556/PostPantanetEf41.rar

Comentário de Jone em 21 abril 2011 às 7:22
Comentário de Hugo Campos em 28 junho 2011 às 22:35
Boa noite, eu to acompanhando seus post sobre EF4.1, e estão muito bacanas e explicado. Minha duvida é se já é ero de utiliza-lo em uma aplicação de medio porte. Ou se devo ainda continuar utilizando o ADO.Net
Comentário de Jone em 28 junho 2011 às 23:32

Hugo, sempre recomendo a utilização de um ORM em qualquer tipo de aplicação, já trabalhei com NHibernate e outros, se você ainda assim preferir ADO, recomendo utilizar o BLToolkit que não chega a ser um ORM completo mas já te obriga a trabalhar com classes. O Entity Framework é um produto maduro e confiável, com suporte da Microsoft, em desenvolvimento constante. A produtividade é maior, mas em contrapartida o desempenho cai um pouco, mas vale a pena utilizar na sua aplicação seja de pequeno, médio ou grande porte.

Comentário de Hugo Campos em 29 junho 2011 às 9:53
Bom dia Jone, obrigado por responder, fiz algumas coisas com NHibernate também, se eles continuarem a desenvolver o CTP vai fica bacana. Uma das questão que me deixa meio recioso é que eu não consigo altera meu modelo sem perde os dados já cadastrados no banco. E mesmo que você projete seu sistema da melhor forma possível sempre há o risco de ser criados mais campos em uma tabela(entidade).
Comentário de Jone em 29 junho 2011 às 14:38
Pra adicionar um campo novo ao modelo, basta criar o campo na tabela do banco de dados e adicionar a propriedade correspondente na classe POCO correspondente dentro do projeto. Só cuidado pra configurar o DatabaseInitializer para nunca recriar o banco de forma automática para não perder os dados.
Comentário de Hugo Campos em 29 junho 2011 às 16:30
Hummm é verdade, obrigado pela dica Jone. Aproveitando a oportunidade será que vc teria um link para mais informações sobre o EF4.1. Por exemplo os campos strings são gravados no banco como NVarchar e eu preciso de Varchar. Outra coisa pelo seu exemplo eu aprendi fazer relacionamento one To Many, porém eu queria sabe como faz relacionamento Many to Many. Obrigado pelas respostas.
Comentário de Jone em 29 junho 2011 às 17:11

Num relacionamento many to many só vão as chaves estrangeiras na tabela, pra isso basta ter uma propriedade do tipo ICollection em cada tabela referenciando a outra. Mas se você precisar adicionar mais campos além das chaves, na realidade essa tabela passa a ser uma entidade propria e entao será preciso criar uma classe específica onde você vai naturalmente fazer o relacionamento one-to-many.

Comentário de Jone em 29 junho 2011 às 17:18

Exemplo:

 

Tabela Pessoas:

public class Pessoa

{

public int Id {get;set;}

public string Nome {get;set;}

public virtual ICollection<Endereco> Enderecos {get;set;}

}

 

public class Endereco

{

public int Id {get;set;}

public string EnderecoCompleto {get;set;}

public ICollection<Pessoa> Pessoas {get;set;}

}

 

Nesse caso, o E.F. irá criar no banco automaticamente uma tabela chamada Enderecos_Pessoas com 2 campos: EnderecoId e PessoaId. Está pronto um relacionamento many-to-many sem a necessidade de existir uma classe EnderecoPessoa.

 

Mas no caso de você precisar de um campo adicional nessa tabela Endereco_Pessoas, você irá precisar criar uma classe:

 

public class EnderecoPessoa

{

public int PessoaId {get;set;}

public int EnderecoId {get;set;}

public string CampoAdicional {get;set;}

 

public virtual Pessoa Pessoa {get;set;}

public virtual Endereco Endereco {get;set;}

}

 

e na classe endereco e pessoa, a ICollection irá referenciar essa entidade EnderecoPessoa:

 

public virtual ICollection<EnderecoPessoa> Enderecos {get;set;}

 

 

Espero ter esclarecido.

Comentário de Hugo Campos em 29 junho 2011 às 22:04

Obrigado pelas resposta mais um vez. Jone não querendo ser abusa mais ja abusando, gostaria de uma ajuda sua se possível.

 

Eu tenho o  seguinte cenario: Uma pagina de pesquisa onde o usuario pode realizar o filtro por varios campos, ate ai tudo bem sem problemas. O que pode acontecer é ele preencher apenas um ou dois campos pra realiza a pesquisa na Banco. Eu não consegui acha nada na internet de como fazer isso usando, Dlinq ou linq to entity e afins. Se você souber de algum material em relação a isso eu agradeço.

Comentar

Você precisa ser um membro de PantaNet para adicionar comentários!

Entrar em PantaNet

Fotos

Carregando...
  • Adicionar fotos
  • Exibir todos

Apoio





 

© 2012   Criado por Gustavo Malheiros.

Badges  |  Relatar um incidente  |  Termos de serviço