2012-01-20 20 views
10

मैं इकाई की रूपरेखा के लिए एक सामान्य भंडार लिख रहा हूँ और करने के लिए के रूप में उलझन में क्या इन कॉल के बीच अंतर कर रहे हैं हूँ:.CreateObjectSet <T>, .Set <T>, और .reateQuery <T> के बीच अंतर।

ObjectContext.CreateObjectSet<T> 
ObjectContext.CreateQuery<T> 
DbContext.Set<T> 

मैं एक सामान्य भंडार है कि दोनों पहले .edmx फाइलों के साथ ही कोड से उत्पन्न संदर्भ का समर्थन करता है चाहता हूँ

public abstract class EntityRepository<TClass> 
    where TClass : class, new() 
{ 
    //private readonly TContext _context; 
    private readonly ObjectSet<TClass> _objectSet; 

    protected EntityRepository(IObjectContextAdapter context) 
    { 
     _objectSet = context.ObjectContext.CreateObjectSet<TClass>(); 

    } 

    protected EntityRepository(ObjectContext context) 
    { 
     _objectSet = context.CreateObjectSet<TClass>(); 
    } 

    public ObjectSet<TClass> Query() 
    { 
     return _objectSet; 
    } 
} 

उदाहरण मुझे लगता है मैं सभी 3 इस्तेमाल किया देखा है ऑनलाइन देखा है, क्या उन दोनों के बीच वास्तविक मतभेद है: DbContext, इसलिए मैं इस मिल गया है? क्या एक बेहतर प्रदर्शन के रूप में है? मुझे पता है कि आप सभी 3 विधियों का उपयोग कर संदर्भों के खिलाफ LINQ क्वेरी लिख सकते हैं।

उत्तर

16

CreateObjectSet<T> आपको ObjectSet<T> देता है जो मूल रूप से टी ऑब्जेक्ट्स का संग्रह करता है, जिसमें इस संग्रह से ऑब्जेक्ट्स, डिलीट, ... के बाद ऑब्जेक्ट्स को हटाने, हटाए जाने की क्षमता होती है ... आप इसे पूछताछ के लिए भी उपयोग कर सकते हैं। यह दी गई इकाई के लिए शीर्ष स्तर की जड़ की तरह है।

CreateQuery<T> आप ObjectQuery<T> है, जो (यह भी IQueryable<T> है) IEnumerable<T> की तरह देखी जा सकती है देता है। यह ऑब्जेक्ट ObjectSet<T> (कुछ स्थितियों इत्यादि) के उप-समूह की तरह है, लेकिन आप इसमें आइटम नहीं जोड़ सकते हैं और इसी तरह।

और अंत में Set<T>DbSet<T> लौटाता है जो कोड प्रथम के लिए पहली विधि/ऑब्जेक्ट का सरलीकृत संस्करण है। उदाहरण के लिए, उदाहरण के लिए, इन वस्तुओं का उपयोग करना आसान है (या इंटरफेस कहने के लिए बेहतर; IDbSet<T>) i.e. इकाई परीक्षण आदि के लिए। ObjectContext और DbContext के समान है।

+0

तो इनमें से प्रत्येक के लिए डेटाबेस के विरुद्ध क्वेरी चलाने पर वास्तव में कोई प्रदर्शन अंतर नहीं है? मेरे मामले में जब मेरा रिपोजिटरी वास्तविक संदर्भ संग्रहीत नहीं कर रहा है, तो क्या आप कहेंगे कि ऑब्जेक्टसेट चुनने का सही मार्ग है, इसलिए मैं इसके साथ सभी सीआरयूडी संचालन कर सकता हूं? – SventoryMang

+2

मूल रूप से, और ऑब्जेक्टसेट : ऑब्जेक्टQuery । चाहे आप एक या दूसरे का उपयोग करके अपनी क्वेरी बनाते हैं, क्वेरी निष्पादन को प्रभावित नहीं करता है। CreateQuery की तुलना में CreateObjectSet पर कॉल में न्यूनतम ओवरहेड है (हम कुछ मेटाडाटा लुकअप करते हैं) लेकिन मुझे आश्चर्य होगा कि अगर इस ओवरहेड के असली दुनिया में कोई प्रभावशाली प्रभाव पड़ा तो मुझे आश्चर्य होगा। DbContext API पर सेट का अपूर्णता अन्य तरीकों से वास्तव में एक पतली परत है। इसका कोई महत्वपूर्ण प्रभाव नहीं होना चाहिए, और पूरी तरह से डीबीकॉन्टेक्स्ट एपीआई का उपयोग करना बहुत आसान और आसान है। – divega

4

जोरी पहले से समझाया गया है इसके अलावा, CreateObjectSet का अधिभार है जो कोई तर्क नहीं लेता है। यह अधिभार स्वचालित रूप से मान लेगा कि इसे ऑब्जेक्टसेट को TENTITY से जुड़े एकमात्र एंटिटीसेट के लिए वापस करना होगा। मॉडल में मेस्ट (एकाधिक-इकाई-सेट-प्रति-प्रकार) होने पर यह फेंक देगा। CreateQuery के सभी अधिभारों को क्वेरी को बूटस्ट्रैप करने के लिए एक इकाई SQL स्ट्रिंग की आवश्यकता है (ध्यान दें कि EntitySet का नाम मान्य इकाई SQL क्वेरी है)।

संबंधित मुद्दे