В отличие от принятого ответа, я считаю, что было бы лучше отдать предпочтение композиции, а не наследованию . Тогда не было бы необходимости хранить такие методы, как SaveChanges, для создания исключения. Более того, зачем вообще нужны такие методы? Вы должны спроектировать класс таким образом, чтобы его потребителя не обманули, когда он посмотрит на его список методов. Открытый интерфейс должен соответствовать фактическим намерениям и цели класса, тогда как в принятом ответе наличие SaveChanges не означает, что Context доступен только для чтения.
В тех местах, где мне нужен контекст только для чтения, например на стороне чтения шаблона CQRS , я использую следующую реализацию. Он не предоставляет своим потребителям ничего, кроме возможностей запросов.
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();
}
}
Используя ReadOnlyDataContext, вы можете получить доступ только к возможностям запросов DbContext. Допустим, у вас есть объект с именем Order, тогда вы должны использовать экземпляр ReadOnlyDataContext, как показано ниже.
readOnlyDataContext.Set<Order>().Where(q=> q.Status==OrderStatus.Delivered).ToArray();