เมื่อเทียบกับคำตอบที่ได้รับการยอมรับผมเชื่อว่ามันจะดีกว่าที่จะให้ประโยชน์แก่องค์ประกอบมรดก จากนั้นก็ไม่จำเป็นต้องรักษาวิธีการเช่น 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 สมมติว่าคุณมีเอนทิตีชื่อ Order จากนั้นคุณจะใช้อินสแตนซ์ ReadOnlyDataContext ในลักษณะดังต่อไปนี้
readOnlyDataContext.Set<Order>().Where(q=> q.Status==OrderStatus.Delivered).ToArray();