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(); } } }