दिलचस्प पोस्ट
आईपैड उपयोगकर्ता एजेंट क्या है? इकाई फ़्रेमवर्क का उपयोग कर केवल एक फ़ील्ड को कैसे अपडेट करें? अंतर के भीतर अंतर और आंतरिक एचटीएमएल जावा अर्रे, खोजना डुप्लिकेट कैसे ओवरराइड करना महत्वपूर्ण है? एक मेकफाइल में पीएचओनी का क्या उद्देश्य है? एक स्तंभ संख्या (जैसे। 127) को एक एक्सेल कॉलम में कैसे परिवर्तित करें (जैसे एए) कैसे Canvas.toDataURL के साथ एक छवि के रूप में कैनवास को बचाने के लिए? दो तिथियों के बीच दिन का अंतर ढूंढें (सप्ताहांत के दिनों को छोड़कर) थीम की उपयोगकर्ता पसंद कार्यान्वित करना सभी सामान्य अपरिभाषित व्यवहार क्या हैं जो एक सी ++ प्रोग्रामर के बारे में जानना चाहिए? विशिष्ट दिनांक पर बनाई गई फ़ाइलों की खोज करने के लिए 'ढूंढें' का उपयोग कैसे करें? मैं प्राथमिक सारांश में एंड्रॉइड पसंद के वर्तमान मूल्य को कैसे प्रदर्शित करूं? क्या क्रोम का जावास्क्रिप्ट कंसोल को सरणी के मूल्यांकन के बारे में आलसी है? Windows पर चलने वाली JAR फ़ाइल

प्रति वेब अनुरोध एक DbContext … क्यों?

मैं बहुत सारे लेख पढ़ रहा हूं जिसमें एंटिटी फ़्रेमवर्क के DbContext को सेट करने के बारे में DbContext जिससे कि केवल एक ही बनाया गया हो और प्रत्येक डीआई फ्रेमवर्क के उपयोग से प्रति HTTP वेब अनुरोध का उपयोग किया जा सके।

यह पहली जगह में एक अच्छा विचार क्यों है? इस दृष्टिकोण का उपयोग करके आपको लाभ क्या मिलता है? क्या कुछ ऐसी स्थितियां हैं जहां यह एक अच्छा विचार होगा? क्या ऐसी कोई चीजें हैं जो आप इस तकनीक का उपयोग कर सकते हैं जो कि आप DbContext प्रति रिपॉजिटरी पद्धति कॉल के तत्काल के DbContext नहीं कर सकते हैं?

वेब के समाधान से एकत्रित समाधान "प्रति वेब अनुरोध एक DbContext … क्यों?"

नोट: यह जवाब इकाई फ़्रेमवर्क के DbContext बारे में बात करता है, लेकिन यह कार्य कार्यान्वयन के किसी भी प्रकार के यूनिट पर लागू होता है, जैसे कि LINQ से एसक्यूएल के DbContext , और NHibernate के ISession

इयान को गूंजते हुए शुरू करते हैं: पूरे एप्लिकेशन के लिए एक एकल DbContext होने से खराब विचार है केवल एक ऐसी स्थिति है जहां यह समझ में आता है जब आपके पास एकल-थ्रेडेड एप्लिकेशन और एक डेटाबेस होता है जो केवल उस एकल एप्लिकेशन उदाहरण द्वारा उपयोग किया जाता है। DbContext थ्रेड-सुरक्षित नहीं है और जब से DbContext कैश डेटा, यह बहुत जल्दी बासी हो जाता है यह आपको सभी प्रकार की परेशानी में मिल जाएगा, जब एकाधिक उपयोगकर्ता / एप्लिकेशन उस डेटाबेस पर एक साथ काम करते हैं (जो बिल्कुल सामान्य है)। लेकिन मुझे उम्मीद है कि आप पहले से ही जानते हैं और सिर्फ यह जानना चाहते हैं कि क्यों न सिर्फ किसी भी ऐसे व्यक्ति में DbContext एक नए उदाहरण (जैसे क्षणिक जीवनशैली के साथ) को DbContext करना चाहिए, जिसकी जरूरत है (अधिक जानकारी के लिए कि एक एकल DbContext या तो संदर्भ प्रति DbContext -बुरा क्यों है, इस उत्तर को पढ़ें)।

मुझे यह कहकर शुरू करें कि क्षणिक के रूप में एक DbContext दर्ज करने से काम हो सकता है, लेकिन आम तौर पर आप किसी निश्चित क्षेत्र के भीतर काम की इस तरह की एक इकाई का एक उदाहरण रखना चाहते हैं। वेब अनुप्रयोग में, यह एक वेब अनुरोध की सीमाओं पर इस तरह के दायरे को परिभाषित करने के लिए व्यावहारिक हो सकता है; इस प्रकार एक प्रति वेब अनुरोध जीवन शैली यह आपको एक समान संदर्भ में ऑब्जेक्ट का एक संपूर्ण सेट संचालित करने देता है। दूसरे शब्दों में, वे उसी व्यवसाय लेनदेन के भीतर काम करते हैं।

यदि आपके पास एक ही संदर्भ में संचालन का संचालन करने का कोई लक्ष्य नहीं है, तो उस स्थिति में क्षणिक जीवन शैली ठीक है, लेकिन देखने के लिए कुछ चीजें हैं:

  • चूंकि प्रत्येक ऑब्जेक्ट का अपना उदाहरण मिलता है, हर श्रेणी जो सिस्टम की स्थिति बदलता है, को _context.SaveChanges() को कॉल करना होगा (अन्यथा परिवर्तन खो जाएंगे)। यह आपके कोड को जटिल कर सकता है, और कोड (संदर्भ को नियंत्रित करने की ज़िम्मेदारी) के लिए दूसरी जिम्मेदारी जोड़ता है, और एकल दायित्व सिद्धांत का उल्लंघन है।
  • आपको यह सुनिश्चित करने की ज़रूरत है कि संस्थाएं [एक DbContext द्वारा लोड और सहेजी DbContext ] कभी भी ऐसी कक्षा की गुंजाइश नहीं DbContext , क्योंकि उनका इस्तेमाल किसी दूसरे वर्ग के संदर्भ में नहीं किया जा सकता है। यह आपके कोड को बेहद जटिल कर सकता है, क्योंकि जब आपको उन संस्थाओं की आवश्यकता होती है, तो आपको आईडी द्वारा उन्हें फिर से लोड करना होगा, जो प्रदर्शन समस्याएं भी पैदा कर सकता है।
  • चूंकि DbContext लागू करता है, इसलिए आप शायद अभी भी सभी बनाए गए उदाहरणों का निपटान करना चाहते हैं। यदि आप ऐसा करना चाहते हैं, तो आपके पास मूल रूप से दो विकल्प हैं context.SaveChanges() को कॉल करने के बाद आपको उसी पद्धति में निपटाने की आवश्यकता है। context.SaveChanges() , लेकिन उस स्थिति में व्यावसायिक तर्क उस वस्तु का स्वामित्व लेता है जिसे इसे बाहर से पारित किया जाता है दूसरा विकल्प एचटीपीपी अनुरोध की सीमा पर सभी तैयार किए गए उदाहरणों का निपटारा करना है, लेकिन उस स्थिति में आपको कंटेनर को यह पता करने की आवश्यकता है कि जब उन उदाहरणों को विस्थापित किया जाना चाहिए, तो आपको कुछ प्रकार के स्क्रॉपिंग की आवश्यकता होती है।

एक अन्य विकल्प एक DbContext बिल्कुल भी इंजेक्ट नहीं करना है । इसके बजाय, आप एक DbContextFactory इंजेक्ट कर DbContextFactory जो एक नया उदाहरण बनाने में सक्षम है (मैं इस दृष्टिकोण को अतीत में इस्तेमाल करता था)। इस तरह से व्यापार तर्क स्पष्ट रूप से इस संदर्भ को नियंत्रित करता है। अगर ऐसा दिख सकता है:

 public void SomeOperation() { using (var context = this.contextFactory.CreateNew()) { var entities = this.otherDependency.Operate( context, "some value"); context.Entities.InsertOnSubmit(entities); context.SaveChanges(); } } 

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

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

विधि इंजेक्शन यह बुरा नहीं है, लेकिन जब व्यापार तर्क अधिक जटिल हो जाता है, और अधिक कक्षाएं शामिल हो जाती हैं, तो आपको इसे विधि से विधि और कक्षा में कक्षा पास करना होगा, जो कोड को बहुत जटिल कर सकता है (मैंने देखा है यह अतीत में)। एक साधारण आवेदन के लिए, यह दृष्टिकोण अभी ठीक काम करेगा।

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

कंटेनर और / या बुनियादी ढांचे को यह संभाल करके, आपका एप्लिकेशन कोड बनाने के लिए (वैकल्पिक रूप से) प्रतिबद्ध और निपटाना एक यूओडब्ल्यू उदाहरण से प्रदूषित नहीं होता है, जो व्यापार तर्क सरल और साफ (केवल एक दायित्व) रखता है। इस दृष्टिकोण के साथ कुछ कठिनाइयां हैं उदाहरण के लिए, क्या आप कॉमेट करते हैं और उदाहरण का निपटान करते हैं?

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

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

 class TransactionalCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand> { readonly DbContext context; readonly ICommandHandler<TCommand> decorated; public TransactionCommandHandlerDecorator( DbContext context, ICommandHandler<TCommand> decorated) { this.context = context; this.decorated = decorated; } public void Handle(TCommand command) { this.decorated.Handle(command); context.SaveChanges(); } } 

यह सुनिश्चित करता है कि आपको केवल एक ही बार इन बुनियादी ढांचे को लिखना होगा। कोई भी ठोस डि कंटेनर आपको इस तरह के डेकोरेटर को कॉन्फ़िगर करने की अनुमति देता है ताकि सभी ICommandHandler<T> कार्यान्वयन एक सुसंगत तरीके से किया जा सके।

मुझे यह बहुत स्पष्ट है क्योंकि डीबीसीओन्टेक्स्ट सभी थ्रेड सुरक्षित नहीं है। इसलिए इस बात को साझा करना एक अच्छा विचार नहीं है।

यहां एक भी उत्तर नहीं है, वास्तव में सवाल का जवाब। ओपी ने एक सिंगलटन / प्रति-एप्लीकेशन डीबीसीओन्टेक्स्ट डिज़ाइन के बारे में नहीं पूछा, उन्होंने एक प्रति (वेब) अनुरोध डिजाइन के बारे में पूछा और क्या संभावित लाभ मौजूद हो सकते हैं।

मेहंदी एक शानदार संसाधन है, जैसे मैं http://mehdi.me/ambient-dbcontext-in-ef6/ का संदर्भ दूंगा:

संभव प्रदर्शन लाभ

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

यह आलसी लोडिंग को सक्षम बनाता है

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

ध्यान रखें कि विपक्ष भी अच्छे हैं। उस लिंक में इस विषय पर पढ़ने के लिए कई अन्य संसाधन हैं।

बस इस पोस्ट करने के बाद किसी और व्यक्ति ने इस प्रश्न पर ठपका कर दिया और उत्तर में अवशोषित नहीं किया, जो वास्तव में सवाल का समाधान नहीं करते हैं।

मैं पिछले राय से सहमत हूं यह कहना अच्छा है, कि अगर आप एकल थ्रेड ऐप में डीबीसीओन्टेक्स को साझा करने जा रहे हैं तो आपको अधिक मेमोरी की आवश्यकता होगी। उदाहरण के लिए, मेरे वेब ऐज़्योर पर ऐप (एक अतिरिक्त छोटे उदाहरण) को और 150 एमबी की स्मृति की आवश्यकता है और मेरे पास प्रति घंटे लगभग 30 उपयोगकर्ता हैं। HTTP अनुरोध में एप्लिकेशन साझा करना डीबीसीटीएक्सटेक्स

यहां वास्तविक उदाहरण की छवि है: आवेदन 12PM में तैनात किया गया है

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

निजी तौर पर मैं जब जरूरत पड़ने पर डीबीसीटीएन्टेक्टेक्स के उदाहरण तैयार करता हूं- आम तौर पर उन व्यावसायिक घटकों से जुड़ा होता है जिनके पास आवश्यकतानुसार संदर्भ को पुनः बनाने की क्षमता होती है। इस तरह मेरे पास इस प्रक्रिया पर नियंत्रण है, एक उदाहरण के लिए मुझ पर मजबूर होने के बजाय तब अगर मैं अभी भी हर अनुरोध के उदाहरण चाहते हैं तो मैं उन्हें सीआईटीआर (डीआई या मैन्युअल रूप से) में बना सकता हूं या उन्हें प्रत्येक नियंत्रक विधि में आवश्यक बना सकता हूं। निजी तौर पर मैं आमतौर पर बाद के दृष्टिकोण को लेता हूं क्योंकि वे वास्तव में आवश्यक नहीं हैं जब डीबीसी प्रस्तुति के उदाहरणों को बनाने से बचें।

यह निर्भर करता है कि आप उस कोण को भी देखेंगे। मेरे लिए प्रति अनुरोध उदाहरण कभी नहीं किया है भावना है। क्या DbContext वास्तव में एचटीपीटी अनुरोध में शामिल है? व्यवहार के मामले में जो गलत जगह है आपके व्यावसायिक घटक को आपके संदर्भ बनाना चाहिए, एचटीटीपी अनुरोध नहीं। इसके बाद आप आवश्यकतानुसार अपने व्यवसाय घटकों को बना सकते हैं या फेंक सकते हैं और संदर्भ के जीवनकाल के बारे में कभी चिंता नहीं कर सकते।

माइक्रोसॉफ्ट द्वारा दो विरोधाभासी सिफारिशें हैं और कई लोग पूरी तरह भिन्न तरीके से डीबीसीटीएक्सनेट्स का इस्तेमाल करते हैं।

  1. एक सिफारिश "डिबॉन्टेक्सट्स को डिस्पोजेबेट्स के रूप में जल्द से जल्द" करने की है क्योंकि डीबीसीटीक्स्ट एलीव के पास बहुमूल्य संसाधन जैसे डीबी कनेक्शन आदि पर कब्जा है ….
  2. अन्य राज्यों में प्रति अनुरोध एक डीबीसीटेन्टेक्शंस अत्यधिक अनुशंसित है

वे एक दूसरे के विपरीत हैं क्योंकि यदि आपका अनुरोध डीबी सामान से कोई असर नहीं कर रहा है, तो आपके डीबीसीओन्टेक्स्ट को बिना किसी कारण के रखा गया है। इस प्रकार यह आपका डबैन्टेक्सट को जीवित रखने के लिए बेकार है, जबकि आपका अनुरोध सिर्फ यादृच्छिक चीज़ों को पूरा करने के लिए इंतजार कर रहा है …

बहुत सारे लोग जो नियम 1 का पालन करते हैं, उनके " रेपॉजिटरी पैटर्न" के भीतर उनके डीबीसीटीएक्सनेट्स होते हैं और एक डाटाबेस क्वेरी प्रति एक नया इंस्टेंस बनाते हैं ताकि एक्स * डीबीसीटीक्स्ट प्रत्येक अनुरोध

वे सिर्फ अपने डेटा प्राप्त करते हैं और संदर्भ ASAP के निपटान करते हैं। यह कई लोगों द्वारा एक स्वीकार्य अभ्यास माना जाता है यद्यपि इसके पास कम से कम समय के लिए अपने डीबी संसाधनों पर कब्जा करने के लाभ हैं, यह सभी यूनिटऑफ़वर्क और कैशिंग कैंडी ईएफ को बलिदान करने के लिए स्पष्ट रूप से बलिदान करता है।

डीबीसीॉन्टेक्स्ट के एक बहुउद्देशीय आवृत्ति को जीवित रखते हुए कैशिंग के लाभ को अधिकतम करता है, लेकिन चूंकि डीबीसीओन्टेक्ट सुरक्षित नहीं है, लेकिन प्रत्येक वेब अनुरोध अपने धागे पर चलता है, एक अनुरोध डीबीसीओन्टेक्स्ट सबसे लंबे समय तक है जो आप इसे रख सकते हैं।

इसलिए ईएफ की टीम की सिफारिश 1 डीबी संदर्भ प्रति अनुरोध का उपयोग करने के बारे में यह स्पष्ट रूप से इस तथ्य पर आधारित है कि एक वेब अनुप्रयोग में यूनिटऑफ़वर्क सबसे अधिक संभावना एक अनुरोध के भीतर हो रहा है और अनुरोध में एक धागा है। इसलिए प्रति अनुरोध एक DbContext UnitOfWork और कैशिंग के आदर्श लाभ की तरह है।

लेकिन कई मामलों में यह सच नहीं है। मैं एक अलग यूनिटऑफ़वर्क की लॉगिंग करने पर विचार करता हूं, इस प्रकार पोस्ट-अनुरोध के लिए एक नया DbContext होने पर एएसआईएनसी धागे में लॉगिंग पूरी तरह स्वीकार्य है

तो अंत में यह बदल जाता है कि एक DbContext के जीवनकाल इन दो मापदंडों के लिए सीमित है। यूनिटऑफ़वर्क और थ्रेड

मैं इसके बारे में क्या पसंद करता हूं, वह यह है कि यह संगठन के कार्य-इकाई को संरेखित करता है (जैसा कि उपयोगकर्ता इसे देखता है – या तो एक पृष्ठ सबमिट) ORM अर्थ में इकाई-के-कार्य के साथ।

इसलिए, आप संपूर्ण पृष्ठ सबमिशन व्यवहार कर सकते हैं, जो आप ऐसा नहीं कर सकते हैं, यदि आप प्रत्येक नए संदर्भ का निर्माण करते हुए सीआरयूडी पद्धतियों को उजागर कर रहे थे।

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

एक समस्या यह है कि एक सिंगलटन डीबीसीॉन्टेक्स्ट एक टाइम बम बन सकता है जो अंततः पूरे डेटाबेस को कैश कर सकता है + मेमोरी में .नेट ऑब्जेक्ट्स का ओवरहेड।

इस व्यवहार के चारों ओर केवल Linq क्वेरीज़ के साथ। .NoTracking() एक्सटेंशन विधि का उपयोग कर रहे हैं। इसके अलावा इन दिनों पीसी में बहुत सी रैम हैं। लेकिन आमतौर पर यह वांछित व्यवहार नहीं है

इकाई फ़्रेमवर्क के साथ विशेष रूप से देखने के लिए एक और मुद्दा है, जब नई संस्थाएं, आलसी लोडिंग, और फिर उन नई संस्थाओं (उसी संदर्भ से) बनाने के संयोजन का उपयोग करते समय। यदि आप IDbSet.Create (केवल नए बनाम) का उपयोग नहीं करते हैं, तो उस इकाई पर आलसी लोडिंग काम नहीं करती है, जब इसे संदर्भ में पुनः प्राप्त किया गया था। उदाहरण:

  public class Foo { public string Id {get; set; } public string BarId {get; set; } // lazy loaded relationship to bar public virtual Bar Bar { get; set;} } var foo = new Foo { Id = "foo id" BarId = "some existing bar id" }; dbContext.Set<Foo>().Add(foo); dbContext.SaveChanges(); // some other code, using the same context var foo = dbContext.Set<Foo>().Find("foo id"); var barProp = foo.Bar.SomeBarProp; // fails with null reference even though we have BarId set.