Arquivos do Blog
O Novo Entity Framework 4.3
Para quem ainda não sabe, foi lançado recentemente a nova versão do Entity Framework 4.3
Entre algumas novidades estão as seguintes:
Code First Migration – É a novidade mais interessante e que muitas pessoas esperavam, agora quando alteramos nosso modelo, o banco de dados não precisa ser recriado do zero novamente. Com o novo recurso de migração as alterações no modelo serão atualizadas no banco de dados.
Remoção da tabela EdmMetadata.
Data Annotations em propriedades não públicas – Agora as anottations aplicadas em propriedades private, internal e protected não serão ignoradas pelo Entity Framework.
Você pode ver mais detalhes sobre o Entity Framework 4.3 clicando no link abaixo:
http://blogs.msdn.com/b/adonet/archive/2012/02/09/ef-4-3-released.aspx
ObjectContext global no Entity Framework: Usar ou não?
Algumas pessoas que usam o Entity Framework, já deve ter se perguntado, será que é recomendado utilizar uma única instância global do ObjectContext ou é melhor uma instância em cada escopo de execução?
A resposta é, depende do cenário. Para aplicações onde terá uma única execução como um Windows Forms, ou aplicações web que não variam com o usuário como um editor de imagens online por exemplo, pode ter vantagens usar uma única instância do ObjectContext como reduzir o número de objetos na memória e gerenciar melhor como estes objetos serão usados. Você, no entanto, precisará gerenciar cuidadosamente o consumo de memória de seu aplicativo, porque o ObjectContext irá manter uma referência de cada entidade recuperada através dele, a menos que você use uma consulta NoTracking ou execute de forma explícita.
Para aplicações ASP.NET ou serviços, o recomendado é você não utilizar um único ObjectContext global por diversas razões, incluindo problemas de execução (O ObjectContext não é thread-safe, ou seja, não suporta multi-threading), muitas referências a entidades em memória (porque o contexto mantém referências a objetos recuperados através dele, como mencionado acima) e a consistência dos dados (como os dados no banco de dados evolui ao longo do tempo, e pode ficar fora de sincronia com os dados no seu repositório de dados a menos que você explicitamente defina a consulta utilizando OverwriteChanges e MergeOption).
Observações:
Pessoal, este texto acima é parte de uma contribuição minha na wiki do Technet da Microsoft onde explico sobre o ObjectContext com base em um texto do próprio pessoal da Microsoft, gostaria de opiniões sobre o texto, se está bem explicado, se falta mais detalhes etc..
Como Trabalhar com Repositório Genérico no Entity Framework
Olá a todos, hoje vou escrever um post falando como podemos implementar um Repositório Genérico usando o Entity Framework.
Primeiramente para quem ainda não sabe, irei explicar resumidamente o que é um repositório.
O Repositório ou Repository, é um objeto geralmente associado a um objeto de negócio como um objeto cliente, por exemplo, responsável por acessar a base de dados, como no exemplo abaixo:
Objeto de negócio:
public class Cliente
{
public int Id {get; set; }
public int Nome {get; set; }
}
Repositório:
public class RepositorioCliente
{
public void Adiciona(Cliente cliente)
{
}
public void Edita(Cliente cliente)
{
}
public Cliente ObtemPorId(int Id)
{
}
public void Deleta(Cliente cliente)
{
}
}
Para usar faríamos assim:
repositorioCliente repositorio = new RepositorioCliente(); repositório.Adiciona(Cliente);
Seguindo o exemplo acima, em um sistema mais complexo teríamos que criar um RepositorioFornecedor, um RepositorioFatura etc.. criando os respectivos métodos de acesso a dados para cada repositório.
Vamos então implementar um repositório genérico, isto é, um repositório padrão
que terá os métodos de criar, editar, deletar e obter onde precisamos apenas
informar qual objeto de negócio desejamos trabalhar no repositório genérico.
Vamos lá, primeiro vamos criar uma interface IRepositorio:
public interface IRepositorio<T> where T : class
{
void Adicionar(T item);
void Remover(T item);
void Editar(T item);
T ObtemPorId(object id);
IQueryable Tudo();
}
Note que a interface possui um parâmetro genérico T, iremos tipar o repositório para o objeto de negócio que desejamos usar.
Vamos agora criar o repositório genérico:
public class Repositorio<T> : IDisposable, IRepositorio where T : class
{
protected readonly DbContext contexto;
public Repositorio(DbContext contexto)
{
this.contexto = contexto;
}
public virtual void Adicionar(T item)
{
contexto.Set<T>().Add(item);
contexto.SaveChanges();
}
public virtual void Remover(T item)
{
contexto.Set<T>().Remove(item);
contexto.SaveChanges();
}
public virtual void Editar(T item)
{
contexto.Entry(item).State = EntityState.Modified;
contexto.SaveChanges();
}
public virtual T ObtemPorId(object id)
{
return contexto.Set<T>().Find(id);
}
public virtual IQueryable Tudo()
{
return contexto.Set<T>();
}
public void Dispose()
{
contexto.Dispose();
}
}
Simples, agora para usar fazemos o seguinte:
using (IRepositorio repositorio = new Repositorio<Cliente>())
{
repositorio.Adiciona(objetoCliente);
}
Ou para uma consulta com LINQ:
using (IRepositorio repositorio = new Repositorio<Cliente>())
{
var lista = from p in repositório.Tudo()
select p;
}
Com este exemplo podemos ver o potencial que o Entity Framework nos oferece para acesso a dados.
Observação:
É importante o método Tudo() ser do tipo IQueryable, dessa forma o IQueryable armazena as operações que estamos fazendo nele com o LINQ e executa a consulta no banco de dados apenas quando vamos acessar os dados.

