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.
Para quem tiver problemas ao tentar baixar o projeto pelo link fornecido no post, aqui vai um link alternativo.
Comentário de Hugo Campos em 28 junho 2011 às 22:35 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
Comentário de Hugo Campos em 29 junho 2011 às 16:30 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.
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.
Adicionado por Gustavo Malheiros 0 Comentários 0 Curtiram isto
Adicionado por Gustavo Malheiros 0 Comentários 0 Curtiram isto
20 agosto 2012 às 20:00 a 31 agosto 2012 às 22:00 – Easy Net
Organizado por Easy Net Tecnologia da Informaçã | Tipo: treinamento
0 Comentários 0 Curtiram isto© 2012 Criado por Gustavo Malheiros.
Você precisa ser um membro de PantaNet para adicionar comentários!
Entrar em PantaNet