स्वीकार किए गए उत्तर के विपरीत, मेरा मानना है कि विरासत पर रचना का पक्ष लेना बेहतर होगा । तब अपवाद को फेंकने के लिए 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();