Neste tutorial vou mostrar como usar o padrão repositório com o Entity Framework em uma aplicação Console Application usando a linguagem C# para criar um camada de acesso a dados bem simples.
O que é o padrão
Repository ? Um repositório é essencialmente uma coleção de objetos de domínio em memória, e, com base nisso o padrão Repository permite realizar o isolamento entre a camada de acesso a dados (DAL) de sua aplicação e sua camada de apresentação (UI) e camada de negócios (BLL). Ao utilizar o padrão Repository você pode realizar a persistência e a separação de interesses em seu código de acesso a dados visto que ele encapsula a lógica necessária para persistir os objetos do seu domínio na sua fonte de armazenamento de dados. Em suma, você pode usar o padrão Repository para desacoplar o modelo de domínio do código de acesso a dados. |
Vai ser um tutorial bem passo a passo para iniciante nenhum botar defeito.
Recursos utilizados:
Explicando o modelo de dados
O modelo de dados no qual nosso exemplo irá se basear será um banco de dados SQL Server chamado Agenda.mdf e as seguintes tabelas:
|
|
Na figura a seguir vemos o relacionamento entre as tabelas:
Note que temos um relacionamento muitos para muitos entre as tabelas Empresas e Setores e a tabela EmpresasSetores é apenas uma tabela auxiliar. Todos os campos Id das tabelas são do tipo Identity.
Nota: Você pode criar o banco de dados e as tabelas usando o IDE do Visual Studio na janela DataBase Explorer ou Server Explorer.
Criando o projeto no Visual Studio
Abra o VS 2012 for Windows desktop e clique em New Project;
A seguir selecione a linguagem C# ou VB .NET e o template Console Application;
Informe o nome EF_DAL_Repositorio e clique no botão OK;
Vamos agora criar um Entity Data Model em nosso projeto com base no banco de dados descrito no início do artigo.
No menu PROJECT clique em Add New Item;
A seguir e selecione o template Data -> ADO .NET Entity Data Model e informe o nome Empresas.emdx e clique no botão Add;
Selecione o item Generate from database e clique no botão Next>;
Selecione a conexão com o banco de dados Agenda.mdf e altere o nome da entity connection para DataBaseContext e clique no botão Next>;
Selecione as tabelas Empresas, EmpresasSetores e Setores. Marque as opções conforme mostra a figura abaixo alterando o nome do Model para DataBaseModel e clique no botão Finish;
Será gerado o nosso Entity Data Model com o seguinte modelo de entidades mapeadas para as tabelas do banco de dados:
Criando o Repositório
Vamos agora iniciar a criação do nosso repositório criando uma interface.
No menu PROJECT clique em Add New Item;
A seguir clique na guia Code e selecione o template Interface informando o nome IRepositorio.cs e clicando no botão Add;
Agora vamos definir o código abaixo em nossa interface :
using System.Linq;
namespace EF_DAL_Repositorio
{
interface IRepositorio<T> where T : class
{
IQueryable GetTodos();
T GetPorId(int id);
void Adicionar(T entity);
void Atualizar(T entity);
void Deletar(T entity);
void Deletar(int id);
}
}
|
Nesta interface definimos 6 métodos que funcionam como um contrato que as classes que implementarem esta interface deverão seguir.
Agora vamos criar a classe Repositorio que deverá implementar esta interface.
No menu PROJECT clique em Add Class;
A seguir informe o nome Repositorio.cs e clicando no botão Add;
Agora digite o código abaixo nesta classe:
using System.Data.Entity;
using System.Linq;
namespace EF_DAL_Repositorio
{
public class Repositorio<T> : IRepositorio<T> where T : class
{
protected DataBaseContext Contexto;
protected DbSet<T> _DbSet;
public Repositorio(DataBaseContext _dbContext)
{
if (_dbContext == null) throw new NullReferenceException("dbContext");
Contexto = _dbContext;
_DbSet = _dbContext.Set<T>();
}
public IQueryable GetTodos()
{
return _DbSet;
}
public T GetPorId(int id)
{
return (T) _DbSet.Find(id);
}
public void Adicionar(T entity)
{
_DbSet.Add(entity);
}
public void Atualizar(T entity)
{
var entry = Contexto.Entry(entity);
_DbSet.Attach(entity);
entry.State = EntityState.Modified;
}
public void Deletar(T entity)
{
var entry = Contexto.Entry(entity);
_DbSet.Attach(entity);
entry.State = EntityState.Deleted;
}
public void Deletar(int id)
{
var entity = GetPorId(id);
if (entity == null) return;
Deletar(entity);
}
}
}
|
A classe Repositorio implementa a interface IRepositorio definindo os 6 métodos da interface. Temos um repositório genérico onde <T> é um tipo que deve ser uma classe.
Agora vejamos um exemplo de utilização do repositório:
using System;
namespace EF_DAL_Repositorio
{
class Program
{
static void Main(string[] args)
{
// Cria um contexto
DataBaseContext contexto = new DataBaseContext();
//define um repositorio
Repositorio<Empresa> empresaRepositorio;
//cria um repositorio para Empresas
empresaRepositorio = new Repositorio<Empresa>(contexto);
//localizando a empresa de id igual a 2 usando o método GetPorId()
Console.WriteLine("Localizando a empresa com Id igual a 2...");
var empresaPorId = empresaRepositorio.GetPorId(2);
Console.WriteLine(empresaPorId.Id.ToString() + " - " + empresaPorId.Nome);
Console.ReadKey();
Console.WriteLine(" ");
// Pega todos os dados das empresas usando o método GetTodos()
var primeiraEmpresa = empresaRepositorio.GetTodos();
Console.WriteLine("Listando todas as empresas...");
Console.WriteLine(" ");
foreach (Empresa _empresa in primeiraEmpresa)
{
Console.WriteLine(_empresa.Nome);
}
Console.WriteLine("Incluindo uma nova empresa...");
Console.ReadKey();
Console.WriteLine(" ");
//Define uma nova empresa
var novaEmpresa = new Empresa { Nome = "JcmSoft Inc.", Telefone = "011-99042869",
Email = "macoratti@yahoo.com" };
//inclui a nova empresa no contexto usando o método Adicionar()
empresaRepositorio.Adicionar(novaEmpresa);
// Escreve o nome da nova empresa no console
Console.WriteLine(novaEmpresa.Nome);
Console.ReadKey();
}
}
}
|
Neste código estamos usando os métodos implementados na classe Repositorio para acessar e persistir dados.
Abaixo vemos o resultado da execução do projeto:
Em outro artigo vou mostrar como podemos melhorar essa implementação separando as classes do Entity Data Model e criando projetos distintos para o Modelo de entidades.
Pegue o projeto completo aqui: EF_DAL_Repositorio.zip
Gostou ? Compartilhe no Facebook Compartilhe no Twitter
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
C# - Sobrecarga de operadores (Operator Overloading) - Macoratti.net