एंटिटी फ्रेमवर्क 4.1 POCO कोड फर्स्ट में वर्चुअल कीवर्ड का क्या प्रभाव हो सकता है?


229

क्या virtualEF कोड फर्स्ट में गुणों पर प्रयोग किए जाने पर कीवर्ड का प्रभाव पड़ता है? क्या कोई विभिन्न स्थितियों में इसके सभी प्रभावों का वर्णन कर सकता है?

उदाहरण के लिए, मुझे पता है कि यह आलसी लोडिंग को नियंत्रित कर सकता है - यदि आप ICollection / one-to-many रिलेशनशिप प्रॉपर्टी पर वर्चुअल कीवर्ड का उपयोग करते हैं, तो यह डिफ़ॉल्ट रूप से आलसी-लोडेड होगा, जबकि यदि आप वर्चुअल कीवर्ड को छोड़ देते हैं, तो यह उत्सुक होना

virtualPOF संस्थाओं के साथ EF में कीवर्ड के अन्य क्या प्रभाव हो सकते हैं ? क्या मुझे इसे virtualअपने सभी गुणों पर उपयोग करने के लिए डिफ़ॉल्ट बनाना चाहिए , या इसका उपयोग नहीं करने के लिए डिफ़ॉल्ट होना चाहिए?

जवाबों:


194

अब तक, मुझे इन प्रभावों का पता है।

  • आलसी लोड हो रहा है : किसी भी virtualICollections जब तक आप विशेष रूप से अन्यथा उन्हें चिह्नित जब तक आलसी लोड किया जाएगा।
  • अधिक कुशल परिवर्तन ट्रैकिंग । यदि आप निम्नलिखित सभी आवश्यकताओं को पूरा करते हैं तो आपकी परिवर्तन ट्रैकिंग आपके आभासी गुणों को कम करके एक अधिक कुशल विधि का उपयोग कर सकती है। लिंक से:

    ट्रैकिंग ट्रैकिंग परदे के पीछे पाने के लिए, मूल नियम यह है कि आपकी कक्षा सार्वजनिक, गैर-सार या गैर-सील होनी चाहिए। आपकी कक्षा को उन सभी संपत्तियों के लिए सार्वजनिक वर्चुअल गेटर्स / सेटर को भी लागू करना चाहिए, जो निरंतर हैं। अंत में, आपको ICollection<T>केवल संग्रह आधारित संबंध नेविगेशन गुणों की घोषणा करनी चाहिए । वे एक ठोस कार्यान्वयन या एक अन्य इंटरफ़ेस नहीं हो सकते हैं जो कि ICollection<T>(Deferred लोडिंग प्रॉक्सी से एक अंतर) से निकला है।

यह वर्णन करने वाला एक अन्य उपयोगी लिंक है MSCO की आवश्यकताएँ POCO प्रॉक्सी बनाने के लिए


52
गुणों को आभासी बनाने का कोई अन्य कारण नहीं है। नेविगेशन गुणों को आलसी लोडिंग के लिए आभासी के रूप में चिह्नित किया गया है और स्केलर गुणों को परिवर्तन ट्रैकिंग के लिए आभासी के रूप में चिह्नित किया गया है।
लादिस्लाव मृंका

10
नेविगेशन गुण क्या हैं और स्केलर गुण क्या हैं?
आबिद अली

9
@ अबिदअली: मेरा मानना ​​है कि एक नेविगेशन संपत्ति एक विदेशी कुंजी (एक इकाई वर्ग प्रकार) या एक से कई संबंध (प्रकार का ICollection <>) है। अदिश गुण एक आधार प्रकार (int, string, ..) या एक ComplexType है (जो कि आधार प्रकारों की एक संरचना है)।
स्कॉट स्टैफ़ोर्ड

2
" public virtual byte[] bigData { get; set; }" आलसी लोड हो रहा है?
अचलोइउ

9
बाइट्स [] उत्सुकता से भरी हुई होगी, केवल विदेशी चाबियाँ आलसी हो सकती हैं। यदि आप उस कॉलम को प्राप्त नहीं करना चाहते हैं, तो कभी भी पूरा रिकॉर्ड प्राप्त न करें - बस .Select(a=>new { fields you want })
स्कॉट स्टैफ़ोर्ड

63

यह वर्चुअल कीवर्ड इकाई ढांचे से डेटा लोड करने के विषय (आलसी लोडिंग, उत्सुक लोडिंग और स्पष्ट लोडिंग) से संबंधित है।

जब आप आलसी लोडिंग के साथ डेटा लोड करना चाहते हैं, तो आपको वर्चुअल कीवर्ड का उपयोग करना चाहिए ।

आलसी लोडिंग एक ऐसी प्रक्रिया है जिसके माध्यम से एक इकाई या संस्थाओं का संग्रह स्वचालित रूप से डेटाबेस से पहली बार लोड किया जाता है।

उदाहरण के लिए, नीचे परिभाषित ब्लॉग इकाई वर्ग का उपयोग करते समय, संबंधित पोस्ट को पहली बार पोस्ट नेविगेशन संपत्ति तक पहुंचने पर लोड किया जाएगा:

public class Blog 
{  
     public int BlogId { get; set; }  
     public string Name { get; set; }  
     public string Url { get; set; }  
     public string Tags { get; set; }  
     public virtual ICollection<Post> Posts { get; set; }  
}

डाक संपत्ति के आलसी लोडिंग को डाक संपत्ति को गैर-आभासी बनाकर बंद किया जा सकता है।

यदि आलसी लोडिंग बंद है, तो पोस्ट संग्रह का लोडिंग अभी भी उत्सुक लोडिंग (शामिल विधि का उपयोग करके) या स्पष्ट रूप से लोडिंग संबंधित संस्थाओं (लोड विधि का उपयोग करके) का उपयोग करके प्राप्त किया जा सकता है।

उत्सुकता से लोड हो रहा है:

using (var context = new BloggingContext()) 
{ 
    // Load all blogs and related posts 
    var blogs1 = context.Blogs 
                          .Include(b => b.Posts) 
                          .ToList(); 
}

स्पष्ट रूप से लोड हो रहा है:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Load the posts related to a given blog 
    context.Entry(blog).Collection(p => p.Posts).Load(); 
}

1
वर्चुअल (आलसी-लोडिंग) का उपयोग करते समय एन + 1 समस्या से कैसे बचें? उदाहरण के लिए, reference.Blogs.ToList (); तब यह तालिकाओं में शामिल नहीं होगा, और यह चुनिंदा क्वेरी को उतने ही ब्लॉग के रूप में चलाएगा।
विशेषज्ञ

1
@Expertwannabe यहां तक ​​कि अगर आप आलसी-लोडिंग का उपयोग करते हैं, तो आप अभी भी स्पष्ट रूप से कॉल करने के लिए उत्सुक लोडिंग का अनुरोध कर सकते हैं Include()
मोनसिग्नर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.