मैं एंटिटी फ्रेमवर्क कोड सबसे पहले वस्तुओं को कैसे अलग करूं?


जवाबों:


156

यदि आप मौजूदा वस्तु का पालन करना चाहते हैं तो @ सलुमा की सलाह का पालन करें। यदि आप ट्रैकिंग परिवर्तनों के उपयोग के बिना वस्तुओं को लोड करना चाहते हैं:

var data = context.MyEntities.AsNoTracking().Where(...).ToList();

जैसा कि टिप्पणी में उल्लेख किया गया है यह पूरी तरह से संस्थाओं को अलग नहीं करेगा। वे अभी भी संलग्न हैं और आलसी लोडिंग कार्य करते हैं, लेकिन संस्थाओं को ट्रैक नहीं किया जाता है। इसका उपयोग उदाहरण के लिए किया जाना चाहिए यदि आप केवल डेटा पढ़ने के लिए इकाई लोड करना चाहते हैं और आप उन्हें संशोधित करने की योजना नहीं बनाते हैं।


3
@ लादिस्लाव: यह वास्तव में शायद योग्य कोडर है। मैंने इस पद्धति के बारे में कभी भी उपयोग नहीं किया है और इसके बारे में सोचा है, हालांकि मैं अक्सर वस्तु सूचियों को लोड करता हूं और एक बार में संदर्भ का निपटान करता हूं, जैसे कुछ using(ctx){ return ctx....ToList(); }। ऐसे मामलों में उपयोग AsNoTracking()करने से बहुत समझ में आता है क्योंकि मैं ऑब्जेक्ट संदर्भ को अनावश्यक रूप से भरना चाहता हूं। मुझे लगता है कि यह विशेष रूप से बड़ी सूचियों के लिए प्रदर्शन और स्मृति खपत का लाभ होगा, है ना?
सलूमा

1
@ सलूमा: हाँ, इसका प्रदर्शन लाभ है। यह वास्तव में क्यों इस विधि मौजूद है। ObjectContext API में इस दृष्टिकोण का उपयोग करना थोड़ा अधिक जटिल है।
लादिस्लाव मृंका

2
क्या यह आलसी लोडिंग को अक्षम करता है?
शॉन मैक्लेन

3
वास्तव में यह आलसी लोडिंग को अक्षम नहीं करेगा यह केवल परिवर्तन ट्रैकिंग को अक्षम करेगा और प्रदर्शन में सुधार करेगा = इकाई अभी भी संलग्न है। मुझे इस प्रश्न का उत्तर देने के बाद मिला, इसलिए आपको @ सुलामा के वैध उत्तर के रूप में चिह्नित करना चाहिए।
लादिस्लाव मृका

1
यह वही चीज है जो मैं चाहता हूं। मैं आलसी लोडिंग और केवल एक अलग इकाई को संशोधित करने की क्षमता चाहता हूं।
शॉन म्लेच्छ

255

यह एक विकल्प है:

dbContext.Entry(entity).State = EntityState.Detached;

3
क्या मैं ऐसा काम कर सकता हूं जब एक आईक्यूएबल लौटाती है?
शॉन म्लेच्छ

1
@ लोल कोडर: मुझे यकीन नहीं है कि अगर मैं आपको सही समझता हूं, लेकिन entityएक प्रकार का भौतिक वस्तु होना चाहिए जो आपके मॉडल वर्गों (व्यक्ति, ग्राहक, आदेश, आदि) का हिस्सा हो। आप सीधे IQueryable <T> में नहीं जा सकते dbContext.Entry(...)। क्या यह सवाल आपका मतलब है?
सलुमा

9
@ एडब्लेंडा: यह निर्भर करता है। यदि आप उस ऑब्जेक्ट को अलग करना चाहते हैं जो पहले से ही संदर्भ से जुड़ा हुआ है, तो राज्य को सेट करें Detached। यदि आप डीबी से संस्थाओं को संदर्भ (बिना किसी परिवर्तन के ट्रैकिंग) में संलग्न किए बिना लोड करना चाहते हैं, तो उपयोग करें AsNoTracking
सुलामा

1
मुझे इस पद्धति से एक दिलचस्प समस्या मिली। भले ही इकाई एक प्रॉक्सी वर्ग हो, लेकिन आपके द्वारा इसकी स्थिति बदलने के बाद आलसी लोडिंग काम नहीं करेगी Detached
kjbartel

4
@kjbartel: यह अपेक्षित व्यवहार है, क्योंकि इकाई का संदर्भ के साथ कोई लिंक नहीं है।
रिकार्डो सूजा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.