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.

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

%d bloggers like this: