क्या फर्क पड़ता है।


228

मेरे पास .AsNoTracking()विस्तार के संबंध में एक प्रश्न है , क्योंकि यह बिल्कुल नया और काफी भ्रमित करने वाला है।

मैं एक वेबसाइट के लिए प्रति-अनुरोध संदर्भ का उपयोग कर रहा हूं।

मेरी बहुत सी इकाइयाँ बदलती नहीं हैं, इसलिए इसे ट्रैक करने की आवश्यकता नहीं है, लेकिन मेरे पास निम्न परिदृश्य है जहाँ मैं इस बात से अनिश्चित हूँ कि डेटाबेस में क्या हो रहा है, या यहाँ तक कि इस मामले में फर्क पड़ता है या नहीं।

यह उदाहरण मैं वर्तमान में कर रहा हूँ:

context.Set<User>().AsNoTracking()
// Step 1) Get user
context.Set<User>()
// Step 2) Update user

यह ऊपर के समान है लेकिन .AsNoTracking()चरण 1 से हटा रहा है :

context.Set<User>();
// Step 1) Get user
context.Set<User>()
// Step 2) Update user

चरण 1 और 2 एक ही संदर्भ का उपयोग करते हैं लेकिन अलग-अलग समय पर होते हैं। क्या मैं बाहर काम नहीं कर सकता कि क्या कोई अंतर है। जैसा कि चरण 2 एक अद्यतन है, मैं अनुमान लगा रहा हूं कि दोनों डेटाबेस से दो बार टकराएंगे।

क्या कोई मुझे बता सकता है कि अंतर क्या है?

जवाबों:


187

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


1
क्या हम चुनिंदा क्वेरी जैसे अनाम संदर्भों के लिए अनाम वर्गों के लिए समान लाभ प्राप्त कर सकते हैं। U.S.Select (u => new {Name = u.Name})? धन्यवाद।
दिलन जयतिलके

6
@DilhanJayathilake: अनाम वर्ग इकाई का प्रतिनिधित्व नहीं करते हैं इसलिए उनके पास ट्रैकिंग नहीं है।
लादिस्लाव मृका

1
चूंकि EF6 किसी दृश्य पर इकाई कुंजी को गलत तरीके से कभी-कभी संक्रमित करता है, इसलिए AsNoTracking () कुंजी को अनदेखा करता है और इसलिए कुंजी को मैन्युअल रूप से ठीक करने के लिए एक विकल्प हो सकता है (कुंजी के अन्य लाभों की आवश्यकता नहीं है)।
22

4
यह भी ध्यान दें, AsNoTracking का सबसे बड़ा प्रभाव यह है कि आलसी लोडिंग काम नहीं करेगी
डगलस गास्केल

170

इस पृष्ठ को देखें Entity Framework और AsNoTracking

AsNoTracking क्या करता है

एंटिटी फ्रेमवर्क आपके अनुप्रयोगों के प्रदर्शन को अनुकूलित करने में आपकी सहायता के लिए कई प्रदर्शन ट्यूनिंग विकल्पों को उजागर करता है। इन ट्यूनिंग विकल्पों में से एक है .AsNoTracking()। यह अनुकूलन आपको यह बताने की अनुमति देता है कि Entity Frameworkकिसी क्वेरी के परिणामों को ट्रैक न करें। इसका अर्थ है कि Entity Frameworkक्वेरी द्वारा लौटाई गई संस्थाओं का कोई अतिरिक्त प्रसंस्करण या भंडारण नहीं करता है। हालाँकि, इसका अर्थ यह भी है कि आप इन संस्थाओं को ट्रैकिंग ग्राफ़ पर रीएक्ट किए बिना अपडेट नहीं कर सकते।

AsNoTracking का उपयोग करके होने वाले महत्वपूर्ण प्रदर्शन लाभ हैं


11
ऐसा लगता है कि लाभ कभी-कभी असंतुलित हो सकते हैं: stackoverflow.com/questions/9259480/…
फैब्रिस

3
एक कदम में एक माता-पिता के बच्चे के रिश्ते को लोड करने के लिए एक जटिल क्वेरी के साथ मेरा प्रदर्शन लाभ लगभग 50% था
कार्ल

53

कोई प्रश्न के लिए LINQ ट्रैकिंग

जब आपकी क्वेरी रीड ऑपरेशंस के लिए होती है तो AsNoTracking () का उपयोग करने की अनुशंसा की जाती है। इन परिदृश्यों में, आपको अपनी इकाइयाँ वापस मिल जाती हैं लेकिन वे आपके संदर्भ से ट्रैक नहीं होते हैं। यह न्यूनतम मेमोरी उपयोग और इष्टतम प्रदर्शन सुनिश्चित करता है

पेशेवरों

  1. नियमित LINQ प्रश्नों पर बेहतर प्रदर्शन।
  2. पूरी तरह से भौतिक वस्तुओं।
  3. प्रोग्रामिंग भाषा में निर्मित सिंटैक्स के साथ लिखने के लिए सबसे सरल।

विपक्ष

  1. सीयूडी संचालन के लिए उपयुक्त नहीं है।
  2. कुछ तकनीकी प्रतिबंध, जैसे: OUTER JOIN प्रश्नों के लिए DefaultIfEmpty का उपयोग करने वाले पैटर्न के परिणामस्वरूप Entity SQL में सरल OUTER JOIN कथनों की तुलना में अधिक जटिल प्रश्न होते हैं।
  3. आप अभी भी सामान्य पैटर्न के मिलान के साथ LIKE का उपयोग नहीं कर सकते हैं।

अधिक जानकारी यहाँ उपलब्ध है:

इकाई फ्रेमवर्क के लिए प्रदर्शन विचार

एंटिटी फ्रेमवर्क और नोट्रैकिंग


34

ट्रैकिंग अक्षम करने से आपके परिणाम सेट मेमोरी में स्ट्रीम हो जाएंगे। जब आप डेटा के बड़े सेट के साथ काम कर रहे होते हैं तो यह अधिक कुशल होता है और आपको एक ही बार में डेटा के पूरे सेट की आवश्यकता नहीं होती है।

संदर्भ:


10

AsNoTracking () EF में "अद्वितीय कुंजी प्रति रिकॉर्ड" आवश्यकता को बायपास करने की अनुमति देता है (अन्य उत्तरों द्वारा स्पष्ट रूप से उल्लेख नहीं किया गया है)।

दृश्य को पढ़ते समय यह बेहद मददगार होता है जो एक अनोखी कुंजी का समर्थन नहीं करता है क्योंकि शायद कुछ क्षेत्र अशक्त हैं या दृश्य की प्रकृति तार्किक रूप से अनुक्रमित नहीं है।

इन मामलों के लिए "की" को किसी भी अशक्त स्तंभ पर सेट किया जा सकता है, लेकिन तब असनोट्रैकिंग () को प्रत्येक क्वेरी रिकॉर्ड (कुंजी द्वारा डुप्लिकेट) को छोड़ दिया जाना चाहिए।


2
बस दृश्य के साथ इस के महत्व को दोहराने के लिए, मेरे पास एक दृश्य से एक प्रश्न है जो एसएसएमएस के माध्यम से चलने पर 7 अद्वितीय रिकॉर्ड देता है। जब EF के माध्यम से चलाया जाता है, AsNoTracking संशोधक के बिना, मुझे पहला रिकॉर्ड मिलता है, दूसरी की तीन प्रतियां और तीसरी की तीन प्रतियां। यह तय करने के लिए बहुत ही अविश्वसनीय सिर-खरोंच था, और यह AsNoTracking का उपयोग कर रहा था जिसने इसे तय किया!
Ade

बिना किसी प्राथमिक कुंजी के दृश्य को क्वेरी करते हुए Linq से Entities तक का उपयोग करते समय मेरे पास यह सटीक मुद्दा था। केवल सिर खुजलाने के आधे दिन के बाद ही AsNoTracking के बारे में पता चला। इस ASP.Net फ़ोरम पोस्ट ने अंततः मुझे इसका नेतृत्व किया। forum.asp.net/t/…
red_dorian

6

यदि आपके पास डीबी को बदलने के लिए कुछ और है (एक अन्य प्रक्रिया कहें) और आपको यह सुनिश्चित करने की आवश्यकता है कि आप इन परिवर्तनों को देखें, उपयोग करें AsNoTracking(), अन्यथा ईएफ आपको अंतिम प्रति दे सकता है जो आपके संदर्भ के बजाय थी, इसलिए आमतौर पर हर संदर्भ में एक नए संदर्भ का उपयोग करना अच्छा होता है :

http://codethug.com/2016/02/19/Entity-Framework-Cache-Busting/

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.