Ao contrário da resposta aceita, acredito que seria melhor favorecer a composição em vez da herança . Então, não haveria necessidade de manter métodos como SaveChanges para lançar uma exceção. Além disso, por que você precisa ter esses métodos em primeiro lugar? Você deve projetar uma classe de forma que seu consumidor não seja enganado ao olhar sua lista de métodos. A interface pública deve estar alinhada com a intenção real e objetivo da classe, enquanto a resposta aceita ter SaveChanges não significa que o Contexto é somente leitura.
Em lugares onde preciso ter um contexto somente leitura, como no lado Leitura do padrão CQRS , uso a implementação a seguir. Ele não fornece nada além de recursos de consulta para seu consumidor.
public class ReadOnlyDataContext
{
private readonly DbContext _dbContext;
public ReadOnlyDataContext(DbContext dbContext)
{
_dbContext = dbContext;
}
public IQueryable<TEntity> Set<TEntity>() where TEntity : class
{
return _dbContext.Set<TEntity>().AsNoTracking();
}
}
Usando ReadOnlyDataContext, você pode ter acesso apenas a recursos de consulta de DbContext. Digamos que você tenha uma entidade chamada Order, então você usaria a instância ReadOnlyDataContext da maneira abaixo.
readOnlyDataContext.Set<Order>().Where(q=> q.Status==OrderStatus.Delivered).ToArray();