2010-06-03 9 views
55

में डिफ़ॉल्ट रूप से आलसी लोडिंग को अक्षम करें ऐसा लगता है कि आलसी लोडिंग डिफ़ॉल्ट रूप से EF4 में सक्षम है। कम से कम, मेरे प्रोजेक्ट में, मैं देख सकता हूं किइकाई फ्रेमवर्क 4

dataContext.ContextOptions.LazyLoadingEnabled 

डिफ़ॉल्ट रूप से सत्य है। मुझे आलसी लोडिंग नहीं चाहिए और मैं लिखना नहीं चाहता हूं:

dataContext.ContextOptions.LazyLoadingEnabled = false; 

हर बार मुझे एक नया संदर्भ मिलता है। तो पूरी परियोजना में, डिफ़ॉल्ट रूप से इसे बंद करने का कोई तरीका है?

उत्तर

63

निम्नलिखित जवाब डाटाबेस-प्रथम या मॉडल-प्रथम कार्यप्रवाह (केवल दो workflows कि इकाई की रूपरेखा (संस्करण < = 4.0) जब प्रश्न पूछा गया था के साथ उपलब्ध थे) को दर्शाता है। यदि आप कोड-प्रथम वर्कफ़्लो (जो ईएफ संस्करण> = 4.1 के बाद से उपलब्ध है) का उपयोग कर रहे हैं तो सही समाधान के लिए इस प्रश्न पर ssmith's answer पर जाएं।


edmx फ़ाइल <ConceptualModel> और <EntityContainer> परिभाषा आलसी लोड करने के लिए एक विशेषता है जहाँ आप आलसी लोड हो रहा है निर्धारित कर सकते हैं गलत पर आम तौर पर है:

<EntityContainer Name="MyEntitiesContext" annotation:LazyLoadingEnabled="false"> 

यह ObjectContext निर्माता में निम्नलिखित सेटिंग बनाता है:

public MyEntitiesContext() : base("name=MyEntitiesContext", "MyEntitiesContext") 
{ 
    this.ContextOptions.LazyLoadingEnabled = false; 
    OnContextCreated(); 
} 

मेरा उदाहरण इस तरह से नहीं है कि उत्पन्न ObjectContext (या DbContext नए ईएफ संस्करणों में) को मैन्युअल रूप से संपादित किया जाना चाहिए (जिसे डेटाबेस से प्रत्येक मॉडल अपडेट के साथ ओवरराइट किया जाएगा, क्योंकि सीटीओआरएक्स ने बताया) लेकिन ईडीएमएक्स फ़ाइल के edmx:ConceptualModels अनुभाग में तत्व annotation:LazyLoadingEnabled="false" विशेषता जोड़कर संपादित किया जाना चाहिए - मैन्युअल रूप से किसी XML संपादक या डिज़ाइनर सतह के गुण पृष्ठ पर जहां यह विकल्प भी उपलब्ध है। ईडीएमएक्स फ़ाइल का यह संशोधन स्वचालित रूप से उपरोक्त दिखाए गए कन्स्ट्रक्टर में अक्षम आलसी लोडिंग विकल्प के साथ संदर्भ वर्ग उत्पन्न करेगा। जब मॉडल डेटाबेस से अद्यतन किया जाता है तो EDMX फ़ाइल संशोधन स्वयं ओवरराइट नहीं होता है।

+0

बिल्कुल सही, धन्यवाद। –

+15

इसके लिए आपको जेनरेट कोड को संशोधित करने की आवश्यकता है, जो आपके मॉडल को संशोधित करते समय अधिलेखित हो जाएगा। ऑब्जेक्ट कॉन्टेक्स्टफैक्टरी को जगह में डालने पर विचार करें, और कारखाने में बदलाव करें। इस तरह आप अभी भी एक बार विकल्प को सेट कर रहे हैं और आप ऑटो जेनरेट कोड बदल नहीं रहे हैं। – ctorx

+0

@ctorx - कारखाने की तुलना में AFAICT एक आसान विकल्प आंशिक ऑनकॉन्टेक्स्ट को लागू करना होगा आलसी लोडिंग को बंद करने के लिए? या क्या मैं कुछ न कुछ भूल रहा हूं? –

58

मैंने how the new Lazy Loading features work with EF Code First दिखाते हुए एक त्वरित नमूना लिखा था। हासिल क्या आप संहिता सबसे पहले मॉडल में चाहते हैं बस अपने DbContext के निर्माता के लिए एक लाइन जोड़ने की बात है, तो जैसे:

public BlogContext() 
{ 
    this.Configuration.LazyLoadingEnabled = false; 
} 
+10

यह महत्वपूर्ण नहीं है, लेकिन दोनों कोड: आधार() 'और' this.' इस कोड में अनावश्यक हैं। –

+0

कार्यक्षमता के मामले में, हां, पठनीयता के मामले में मुझे लगता है कि कभी-कभी 'यह' शामिल करना उपयोगी होता है। मैं 'बेस() पर सहमत हूं, हालांकि, मैं इसे जोड़ने का कोई कारण नहीं सोच सकता। –

+0

हाँ, सुनिश्चित नहीं है कि बेस() उसमें क्यों था। हटा दिया। – ssmith

24

उपयोग किए जा रहे हैं EF4 कोड पहले, हाँ? इसलिए, आपके संदर्भ के आरंभ में, 'ऑनमोडेलक्रेटेड' का ओवरराइड है।

इस विधि में, मैंने बस संपत्ति को बुलाया और सेट किया और सभी को हल किया गया।

protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
    base.Configuration.LazyLoadingEnabled = false; 
} 

मेरा मॉडल अब और अधिक आकर्षक है। आलसी लोडिंग बहुत बढ़िया है ... लेकिन जब आप इसे नहीं चाहते हैं। और जब आप परिपत्र संदर्भ प्राप्त करना शुरू करते हैं, तो यह सिर्फ हास्यास्पद है।

+4

यह काम नहीं करेगा क्योंकि यह केवल संदर्भ उदाहरण के लिए आलसी लोडिंग अक्षम करेगा जो मॉडल बनाता है (आमतौर पर एप्लिकेशन प्रारंभ होने के बाद पहली बार उपयोग किया गया उदाहरण)। बाद के सभी संदर्भ उदाहरणों के लिए 'ऑनमोडेल क्रिएटिंग' को नहीं कहा जाता है और 'LazyLoadingEnabled' का डिफ़ॉल्ट मान होगा - जो' सत्य 'है। – Slauma

+0

@ स्लुमा - मैंने आज भी एक ही समस्या को मारा, और मैंने इसे इस उत्तर को संपादित किया है (क्योंकि यह स्वीकार किया गया है) इसे बदलने के लिए इसे ctor में बदलने के लिए। अगर मेरे पास इस से स्वीकार्य उत्तर बदलने की शक्ति थी, तो मैं इसके बजाय ऐसा करूंगा। :) –

+1

@ जेम्समैनिंग: इस प्रश्न का एक अजीब इतिहास है। मेरा जवाब कुछ महीने पहले स्वीकार किया गया था। लेकिन मेरा जवाब अच्छा नहीं है (ctorx आलोचक बहुत मान्य है)। फिर प्रश्न मालिक ने इस स्वीकृति को स्वीकार कर लिया जो आपके संपादन तक सादा गलत था। इसके अलावा यह 'डीबीकॉन्टेक्स्ट' का उत्तर है जो प्रश्न पूछने के बाद बहुत कुछ आया था और प्रश्न में कोड स्निपेट अभी भी 'ऑब्जेक्ट कॉन्टेक्स्ट' के लिए हैं। अब आपने इसे 'डीबीकॉन्टेक्स्ट' के सही जवाब में संपादित कर दिया है, लेकिन यह अब स्स्मिथ के उत्तर की तरह है जो एक वर्ष से अधिक पुराना है। लेकिन दोनों 'ऑब्जेक्ट कॉन्टेक्स्ट' के लिए उत्तर नहीं हैं। बहुत पागल :) – Slauma

21

आप इसे डिजाइनर से भी कर सकते हैं। बस .edmx फ़ाइल खोलें, मॉडल पर कहीं भी राइट-क्लिक करें और गुण चुनें। फिर LazyLoadingEnabled को झूठी पर सेट करें। enter image description here

4

यदि आप कोड-पहले मॉडलिंग कर रहे हैं, तो बस अपने संदर्भ/ऑब्जेक्ट गुणों पर virtual कीवर्ड हटा दें। किसी संदर्भ पर आभासी होने से उस विशेष संदर्भ पर LazyLoading सक्षम हो जाएगा।