Trái ngược với câu trả lời được chấp nhận, tôi tin rằng sẽ tốt hơn nếu ưu tiên thành phần hơn là thừa kế . Sau đó, sẽ không cần phải giữ các phương thức như SaveChanges để đưa ra một ngoại lệ. Hơn nữa, tại sao bạn cần phải có những phương pháp như vậy ngay từ đầu? Bạn nên thiết kế một lớp theo cách mà người tiêu dùng của nó không bị lừa khi nhìn vào danh sách các phương thức của nó. Giao diện công khai phải phù hợp với mục đích và mục tiêu thực tế của lớp trong khi trong câu trả lời được chấp nhận có SaveChanges không ngụ ý rằng Ngữ cảnh là chỉ đọc.
Ở những nơi mà tôi cần có ngữ cảnh chỉ đọc, chẳng hạn như trong mẫu CQRS bên Đọc , tôi sử dụng cách triển khai sau. Nó không cung cấp bất cứ thứ gì khác ngoài khả năng Truy vấn cho người tiêu dùng.
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();
}
}
Bằng cách sử dụng ReadOnlyDataContext, bạn có thể chỉ có quyền truy cập vào các khả năng truy vấn của DbContext. Giả sử bạn có một thực thể có tên Order, sau đó bạn sẽ sử dụng cá thể ReadOnlyDataContext theo cách như bên dưới.
readOnlyDataContext.Set<Order>().Where(q=> q.Status==OrderStatus.Delivered).ToArray();