14

यह मेरी पहली ईएफ परियोजना है इसलिए कृपया मेरे साथ भालू।एंटीटी फ्रेमवर्क में एकाधिक सक्रियताएं 4.1 कोड प्रथम

विभाग जैसे किसी इकाई को अद्यतन करते समय, आप इसे संदर्भ से खींचते हैं, इसके मान अपडेट करते हैं और संदर्भ कहते हैं। सेव चेंज। हालांकि, अगर आप विभाग को अद्यतन करते हैं। कर्मचारी, ईएफ को मजाकिया नहीं लगता है।

मैं खोज की है और Multipleactiveresultsets = कनेक्शन स्ट्रिंग में सच करने का विकल्प के साथ आया था, लेकिन यह जानना चाहते हैं हैं:

  • इस सिफारिश रास्ता नहीं है?
  • क्या यह प्रदर्शन पर प्रतिकूल प्रभाव डालता है/मुझे क्या देखना चाहिए?

उत्तर

33

एमएआरएस सक्षम करना केवल तभी आवश्यक है जब आप समानांतर में समान कनेक्शन पर एकाधिक क्वेरी निष्पादित करना चाहते हैं। ऐसा होता है यदि आप ऐसा कुछ करते हैं:

/* Foreach uses an iterator over the resultset of your query, but the query is not fetched 
    immediately, instead the iterator internally triggers fetching for single 
    processed record from opened data reader. Because of that the query and the reader 
    are active until the iteration is over. */ 
foreach (var department in context.Departments.Where(...)) 
{ 
    /* The first query is still active on the connection but now you are executing 
     lazy loading of all related employees =>. You are executing a second query and, 
     without MARS, you will get an exception. */ 
    var employee = department.Employees.FirstOrDefault(...); 
} 

इससे कैसे बचें? आलसी लोड करने के बजाय

  • उपयोग उत्सुक लोड हो रहा है: context.Departments.Include(d => d.Employees)
  • मटेरियलाइज़ पूरे विभाग के परिणाम आलसी लोड हो रहा है उपयोग करने से पहले निर्धारित किया है। इसका मतलब है कि लूप के अंदर कर्मचारियों तक पहुंच नहीं है।
  • मार्स सक्षम और उल्लेख उदाहरण बस काम करेंगे

इस सिफारिश रास्ता नहीं है? क्या यह प्रदर्शन को प्रभावित करता है/ मुझे क्या देखना चाहिए?

यह उस समस्या पर निर्भर करता है जिसे आप हल करने का प्रयास कर रहे हैं। यदि आपके पास प्रक्रिया करने के लिए कई विभाग हैं, तो उनके कर्मचारियों के संग्रह तक पहुंचने से प्रत्येक विभाग के लिए एक अलग क्वेरी ट्रिगर होगी। इसे एन + 1 समस्या कहा जाता है - आपके पास एन विभाग हैं और उन्हें लाने के लिए एक प्रश्न है और प्रत्येक विभाग के लिए आप एक अतिरिक्त क्वेरी => एन + 1 प्रश्न निष्पादित करेंगे। बड़ी संख्या में विभागों के लिए यह एक प्रदर्शन हत्यारा होगा।

उत्सुक लोडिंग बुलेट प्रूफ समाधान नहीं है। यह affect performance as well कर सकता है। कभी-कभी आपको सभी आवश्यक कर्मचारियों को लाने के लिए अलग-अलग प्रश्नों को निष्पादित करने और सभी आवश्यक कर्मचारियों को लाने के लिए अलग-अलग प्रश्नों को निष्पादित करने की आवश्यकता होती है। यदि आपके पास आलसी लोडिंग बंद है तो इसे अपने संबंधों को ठीक करना चाहिए और कर्मचारियों के लिए सही ढंग से संपत्ति भरना चाहिए। बीटीडब्ल्यू, मैंने बॉक्स के बाहर इस सुविधा का समर्थन करने के लिए suggestion on Data UserVoice बनाया।

+0

धन्यवाद। मैं उम्मीद कर रहा था कि आप इस पोस्ट को नोटिस करेंगे। डेटा उपयोगकर्ता विकल्प पर भी आपके सुझाव के लिए वोट दें। –

+0

भविष्य के संदर्भ के लिए यह भी पता है कि ** समानांतर में केवल कोड स्तर ** पर है। एमएसडीएन दस्तावेज से * एमएआरएस एक कनेक्शन के भीतर कई अनुरोधों के अंतःस्थापित निष्पादन को सक्षम बनाता है। यही है, यह एक बैच चलाने की अनुमति देता है, और इसके निष्पादन के भीतर, यह अन्य अनुरोधों को निष्पादित करने की अनुमति देता है। नोट, हालांकि, एमएआरएस को समानांतर निष्पादन के संदर्भ में इंटरलिविंग के संदर्भ में परिभाषित किया गया है। * Https://msdn.microsoft.com/en-us/library/ms131686.aspx – PedroC88

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