A diferencia de la respuesta aceptada, creo que sería mejor favorecer la composición sobre la herencia . Entonces no habría necesidad de mantener métodos como SaveChanges para lanzar una excepción. Además, ¿por qué necesita tener tales métodos en primer lugar? Debe diseñar una clase de manera que su consumidor no se deje engañar cuando mire su lista de métodos. La interfaz pública debe estar alineada con la intención y el objetivo reales de la clase, mientras que en la respuesta aceptada tener SaveChanges no implica que el contexto sea de solo lectura.
En lugares donde necesito tener un contexto de solo lectura, como en el lado de lectura del patrón CQRS , utilizo la siguiente implementación. No proporciona nada más que funciones de consulta a su 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();
}
}
Al usar ReadOnlyDataContext, puede tener acceso solo a las capacidades de consulta de DbContext. Digamos que tiene una entidad llamada Order, entonces usaría la instancia ReadOnlyDataContext de la siguiente manera.
readOnlyDataContext.Set<Order>().Where(q=> q.Status==OrderStatus.Delivered).ToArray();