using C<%= solutionName %>Dominio.Repositorios;
using System;
using System.Data.Entity;
using System.Linq;
namespace <%= solutionName %>.Dados.Repositorios
{
/// Repositório padrão para CRUD básico.
/// Tipo (classe) de dados que esse repositório manipulará.
public class RepositorioEntityFramework: IRepositorio where T:class
{
/// Referência ao contexto de dados a qual esse repositório pertence.
protected DbContext _contexto { get; set; }
/// Construtor do Repositório Padrão para detecção automática do IDbSet referente a T.
/// O contexto de dados ao qual esse repositório pertence.
/// Quando o contexto passado não possui um IDbSet referente a T
/// É necessário que o contexto passado possua alguma propriedade que implemente o DbSet referente a T
public RepositorioEntityFramework(DbContext contexto)
{
try
{
contexto.Set();
}
catch(Exception ex)
{
throw new ArgumentException(string.Format($"Não foi possível detectar o DbSet correspondente ao tipo {typeof(T).Name}. Verifique se o objeto de contexto de dados é válido. Detalhes do erro: {ex}"));
}
_contexto = contexto;
}
/// Obter um objeto específico de acordo com sua ID.
/// ID do objeto a ser retornado.
/// O objeto que possua a ID informada.
public virtual T ObterPorId(int id)
{
return _contexto.Set().Find(id);
}
/// Acrescenta um objeto ao repositório.
/// O objeto a ser acrescentado ao repositório.
public virtual void Acrescentar(T objeto)
{
_contexto.Set().Add(objeto);
}
/// Edita um objeto existente no repositório com base em sua ID.
/// O objeto que será usado como base para editar o objeto existente.
public virtual void Editar(T objeto)
{
_contexto.Set().Attach(objeto);
_contexto.Entry(objeto).State = EntityState.Modified;
}
/// Exclui um objeto existente no repositorio
/// A ID do objeto a ser excluído
public virtual void Excluir(int id)
{
var objeto = _contexto.Set().Find(id);
_contexto.Set().Remove(objeto);
}
/// Exclui um objeto existente no repositorio
/// O objeto a ser excluído
public virtual void Excluir(T objeto)
{
_contexto.Set().Remove(objeto);
}
/// Lista todos os objetos do repositorio
/// IQueryable contendo todos os objetos do repositorio
public virtual IQueryable ListarTodos()
{
return _contexto.Set();
}
/// Lista todos os objetos do repositorio sem manter informações de mudança.
/// IEnumerable contendo todos os objetos do repositorio
public IQueryable ListarTodosSomenteLeitura()
{
return _contexto.Set().AsNoTracking();
}
/// Efetiva as mudanças realizadas na fonte
public virtual void SaveChanges()
{
_contexto.SaveChanges();
}
}
}