2011-10-12 12 views
49

तो मैं घोषणा की है आभासी रूप में अपने मॉडल में इकाई संबंध तो मेरे LINQ क्वेरी में Include कथन का उपयोग करने की कोई जरूरत है, है ना ?? है -इकाई की रूपरेखा 4.1 वर्चुअल गुण

पूर्व के लिए: यह मेरा मॉडल वर्ग है :

public class Brand 
{ 
    public int BrandID { get; set; } 
    public string BrandName { get; set; } 
    public string BrandDesc { get; set; } 
    public string BrandUrl { get; set; } 

    public virtual ICollection<Product> Products { get; set; } 
} 

अब, ऊपर मॉडल वर्ग के लिए, मुझे नहीं var brandsAndProduct = pe.Brands.Include("Products").Single(brand => brand.BrandID == 22); उपयोग करने के लिए की जरूरत है।

इसके बजाय, मैं बस सरल var brandsAndProduct = pe.Brands.Where(brand => brand.BrandID == 22); का उपयोग कर सकता हूं और एक्सेस होने पर स्वचालित रूप से संबंधित इकाई उपलब्ध होगी।

क्या मैं अपनी समझ में सही हूं?

इसके अलावा, कृपया मुझे बताएं कि मुझे किस स्थिति में एक दूसरे को पसंद करना चाहिए ??

उत्तर

158

आप सही हैं लेकिन नियम वास्तव में अपेक्षा के अनुसार काम करने के लिए अधिक जटिल है। यदि आप अपनी नेविगेशन प्रॉपर्टी को परिभाषित करते हैं virtual ईएफ रनटाइम पर आपके Brand कक्षा से व्युत्पन्न एक नई कक्षा (गतिशील प्रॉक्सी) बनायेगा और इसके बजाय इसका उपयोग करेगा। इस नई गतिशील रूप से निर्मित कक्षा में पहली बार पहुंचने पर नेविगेशन प्रॉपर्टी लोड करने के लिए तर्क शामिल है। इस सुविधा को आलसी लोडिंग (या बेहतर पारदर्शी आलसी लोडिंग) कहा जाता है।

क्या नियम यह काम करने के लिए पूरा किया जाना चाहिए:

  • वर्ग के सभी नेविगेशन गुण virtual
  • गतिशील प्रॉक्सी निर्माण प्रयोग नहीं किया जाना चाहिए होना चाहिए (context.Configuration.ProxyCreationEnabled)। इसे बाई दिफ़ौल्ट मर्थकृत किया गया है।
  • आलसी लोडिंग को अक्षम नहीं किया जाना चाहिए (context.Configuration.LazyLoadingEnabled)। इसे बाई दिफ़ौल्ट मर्थकृत किया गया है।
  • संदर्भ को संदर्भित किया जाना चाहिए (डिफ़ॉल्ट रूप से यदि आप डेटाबेस से इकाई लोड करते हैं) को संदर्भित किया जाना चाहिए और संदर्भ को संदर्भित नहीं किया जाना चाहिए = आलसी लोडिंग केवल डेटाबेस से लोड करने के लिए उपयोग किए जाने वाले जीवित संदर्भ के दायरे में काम करती है (या जहां प्रॉक्सी इकाई संलग्न की गई थी)

आलसी लोडिंग के विपरीत उत्सुक लोडिंग कहा जाता है और यह Include करता है। यदि आप Include का उपयोग करते हैं तो आपकी नेविगेशन प्रॉपर्टी मुख्य इकाई के साथ एक साथ लोड की जाती है।

आलसी लोडिंग और उत्सुक लोडिंग का उपयोग आपकी आवश्यकताओं और प्रदर्शन पर भी निर्भर करता है। Include एकल डेटाबेस क्वेरी में सभी डेटा लोड करता है लेकिन इसमें बहुत से इकाइयों को शामिल करने या लोड करने का उपयोग करते समय huge data set का परिणाम हो सकता है। यदि आप सुनिश्चित हैं कि आपको प्रसंस्करण के लिए Brand और सभी Products की आवश्यकता होगी तो आपको उत्सुक लोडिंग का उपयोग करना चाहिए।

आलसी लोडिंग का उपयोग बदले में किया जाता है यदि आप सुनिश्चित नहीं हैं कि आपको किस नेविगेशन संपत्ति की आवश्यकता होगी। उदाहरण के लिए यदि आप 100 ब्रांड लोड करते हैं लेकिन आपको केवल एक ब्रांड से उत्पादों तक पहुंचने की आवश्यकता होगी, तो प्रारंभिक क्वेरी में सभी ब्रांडों के लिए उत्पादों को लोड करने की आवश्यकता नहीं है। प्रत्येक नेविगेशन प्रॉपर्टी के लिए आलसी लोडिंग का नुकसान अलग-अलग क्वेरी (डेटाबेस राउंडट्रिप) है>> यदि आप 100 ब्रांडों को शामिल किए बिना लोड करते हैं और आप प्रत्येक Brand में Products प्रॉपर्टी एक्सेस करेंगे तो आपका कोड इन नेविगेशन गुणों को पॉप्युलेट करने के लिए 100 अन्य प्रश्न उत्पन्न करेगा = उत्सुक लोडिंग केवल गायक क्वेरी का उपयोग करेगी लेकिन आलसी लोडिंग 101 प्रश्नों का उपयोग करती है (इसे एन + 1 समस्या कहा जाता है)।

अधिक जटिल परिदृश्यों में आप पाते हैं कि इन रणनीतियों में से कोई भी आपको आवश्यकतानुसार निष्पादित नहीं करता है और आप ब्रांड्स को लोड करने के लिए स्पष्ट लोडिंग या अलग-अलग प्रश्नों का उपयोग कर सकते हैं और आपको आवश्यक सभी ब्रांडों के उत्पादों के मुकाबले अलग-अलग प्रश्नों का उपयोग कर सकते हैं।

स्पष्ट लोड हो रहा है आलसी लोड हो रहा है के रूप में इसी तरह के नुकसान है, लेकिन आप इसे मैन्युअल रूप से गति प्रदान करना होगा:

context.Entry(brand).Collection(b => b.Products).Load(); 

स्पष्ट लोड करने के लिए मुख्य लाभ संबंध फिल्टर करने की क्षमता है। आप का उपयोग Load() से पहले कर सकते हैं और किसी भी फ़िल्टरिंग या नेस्टेड रिश्तों की भी उत्सुक लोडिंग का उपयोग कर सकते हैं।

+3

मुझे लगता है कि यह उत्तर संक्षिप्त और पूर्ण है ... धन्यवाद। संदर्भित "संबंधित डेटा लोड हो रहा है" http://msdn.microsoft.com/en-us/magazine/hh205756.aspx – Lijo

+0

आपके उत्तर के लिए धन्यवाद। यह अभी भी 2016 में मेरी मदद करता है। और मेरे पास एक और सवाल है: क्या हमेशा एक कॉल में हर संपत्ति को उत्सुक लोड करने का कोई तरीका है? चूंकि ऐसी कुछ स्थितियां हैं जिनके मॉडल में कई नेविगेशन गुण हैं और हर बार लोड होने की आवश्यकता है। – anuith

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