इकाई फ्रेमवर्क में प्रति डेटा उदाहरण प्रति कैश नहीं है, प्रति संदर्भ उदाहरण केवल कैश है।
यदि आप प्रति अनुरोध या क्वेरी के साथ एक नया संदर्भ बनाते हैं तो आप एक खाली कैश से शुरू करते हैं और ईएफ डाटाबेस से डेटा लाएगा।
इसके अलावा, "कैश प्रति संदर्भ उदाहरण" शब्द भ्रामक हो सकता है क्योंकि इसका मतलब यह नहीं है कि यदि ईएफ संदर्भ संदर्भ कैश में पहले ही लोड हो चुकी है तो ईएफ डेटाबेस से क्वेरी नहीं चलाएगा। ,
हर LINQ करने वाली संस्थाओं क्वेरी एक DbSet<T>
पर या आम तौर पर एक IQueryable<T>
पर एक डेटाबेस क्वेरी चलेंगे: जिस तरह से है कि यह कैसे काम करता है कैश और आप इसे कैसे (या नहीं) का लाभ उठा सकें पीछा कर रहा है इससे कोई फर्क नहीं पड़ता कि संस्थाएं संदर्भ में पहले से मौजूद हैं या नहीं। लेकिन यदि एक क्वेरी वाली क्वेरी के साथ एक इकाई पहले से मौजूद संदर्भ में मौजूद है, तो ईएफ उस क्वेरी के परिणाम को फेंक देगा और कैश किए गए इकाई आवृत्ति को वापस कॉलर पर वापस कर देगा।
यह जांच करता है कि के बाद यह कुंजी मौजूद है, तो यह जांच करता है। (जटिल प्रश्नों के लिए - उदाहरण के प्रश्नों के लिए है कि एक Include
होते हैं -। यह पहले यह चेक नहीं कर सकते, क्योंकि यह पता नहीं कर सकते हैं जो संस्थाओं और मुख्य मान लौटाए जाएंगे)
डिफ़ॉल्ट व्यवहार है कि (MergeOption
AppendOnly
है)। आप इस व्यवहार को OverwriteChanges
और अन्य विकल्पों में बदल सकते हैं, मेरा मानना है कि उनमें से कोई भी LINQ क्वेरीज हमेशा डेटाबेस प्रश्न जारी नहीं करेगा।
सिर्फ उसके प्रमुख द्वारा एक इकाई की क्वेरी आप उपयोग कर सकते हैं GetObjectByKey
या Find
(DbContext
के साथ) जो पहले की जाँच करेगा कि अगर कुंजी के साथ इकाई पहले से संदर्भ में कैश किया गया है और उसके बाद इस संचित वस्तु लौटने। यदि नहीं, तो यह लोड करने के लिए डेटाबेस क्वेरी चलाएगा।
आप ईएफ के चेंजट्रैकर से पूछ सकते हैं, यह विशेष रूप से DbContext
के साथ समर्थित है जहां आपके पास DbSet<T>.Local
संग्रह के माध्यम से संदर्भ कैश तक पहुंच है।
समस्या यह है कि Local
पर कोई प्रश्न न मिलने पर डेटाबेस को स्वचालित रूप से क्वेरी करने के लिए कोई तर्क नहीं है। आपको यह तर्क मैन्युअल रूप से लिखना होगा। यहां तक कि बड़ी समस्या यह है कि Local
पर एक क्वेरी LINQ-to-Objects है और LINQ-to-Entities (Local
IQueryable<T>
लागू नहीं करती है, केवल IEnumerable<T>
), इसलिए आपको Local
पर कार्य करने के लिए अक्सर अपने प्रश्नों को फिर से लिखना होगा - उदाहरण के लिए आप Include
यहाँ उपयोग नहीं कर सकते हैं, अपने किसी भी EntityFunctions
उपयोग नहीं कर सकते, तो आप आदि केस संवेदनशीलता के बारे में स्ट्रिंग तुलना के लिए अलग व्यवहार, आदि, मिल जाएगा
मुझे नहीं लगता कि इतना है कि डेटा में कैश किया गया है है संस्थाएं हमेशा पूछती हैं डीबी –