c# - क्या अंतर करता है.अनोट्रैकिंग() बनाते हैं?




.net entity-framework (4)

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

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

मेरी कई संस्थाएं नहीं बदली हैं इसलिए उन्हें ट्रैक करने की आवश्यकता नहीं है, लेकिन मेरे पास निम्न परिदृश्य है जहां मुझे डेटाबेस में क्या हो रहा है, या यहां तक ​​कि इस मामले में कोई फर्क पड़ता है या नहीं।

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

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

यह उपरोक्त जैसा ही है लेकिन चरण 1 से .AsNoTracking() को हटा रहा है:

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

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

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


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

यह एक ऐसा दृश्य पढ़ने पर बेहद सहायक होता है जो अद्वितीय कुंजी का समर्थन नहीं करता है क्योंकि शायद कुछ फ़ील्ड शून्य हैं या दृश्य की प्रकृति तार्किक रूप से अनुक्रमित नहीं है।

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


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


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

संदर्भ:


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

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







entity-framework-4.3