Entity Framework - Como criar uma camada de acesso a dados simples usando o padrão repositório


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:

  • Empresas
    • Id
    • Nome
    • Telefone
    • Email
  • Setores
    • Id
    • Nome
  • EmpresasSetores
    • Id
    • EmpresaId
    • SetorId

 

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:


José Carlos Macoratti