На відміну від прийнятої відповіді, я вважаю, що було б краще віддати перевагу композиції над спадщиною . Тоді не потрібно буде зберігати такі методи, як SaveChanges, щоб кинути виняток. Більше того, навіщо вам потрібно мати такі методи в першу чергу? Ви повинні розробити клас таким чином, щоб його споживач не обдурив, коли він переглядає його список методів. Публічний інтерфейс повинен відповідати фактичному наміру та цілі класу, тоді як у прийнятій відповіді, що містить SaveChanges, не випливає, що Контекст є лише для читання.
У тих місцях, де мені потрібно мати контекст, доступний лише для читання, наприклад, на стороні читання шаблону 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. Скажімо, у вас є сутність з ім'ям Порядок, тоді ви використовували б екземпляр ReadOnlyDataContext таким чином, як нижче.
readOnlyDataContext.Set<Order>().Where(q=> q.Status==OrderStatus.Delivered).ToArray();