16

पर विचार करेंइकाई फ्रेमवर्क में, आलसी लोडिंग एक-से-शून्य-या-एक नेविगेशन प्रॉपर्टी के लिए क्यों काम नहीं कर रही है?

class Person 
{ 
    public int PersonId { get; set; } 
    public virtual Address Address { get; set; } 
} 

class Address 
{ 
    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 
} 

जहां केवल कुछ व्यक्तियों कोई पता है के रूप में परिभाषित Person और Address कक्षाएं, लेकिन सभी के पते एक व्यक्ति की है। यह एक one-to-zero-or-one relationship है, इसलिए मैं

modelBuilder.Entity<Address>() 
    .HasKey(a => a.PersonId) 
    .HasRequired(a => a.Person) 
    .WithOptional(a => a.Address); 

के रूप में यह कॉन्फ़िगर अब, मेरी कोड में निम्नलिखित दृष्टिकोण (उत्सुक लोड हो रहा है) पूरी तरह से ठीक काम करता है।

var person = context.Person 
    .Include(a => a.Address) 
    .Single(a => a.PersonId == 123); 
var address = person.Address; // address != null (correct) 

हालांकि, निम्नलिखित दृष्टिकोण (आलसी लोडिंग) नहीं है।

var person = context.Person 
    .Single(a => a.PersonId == 123); 
var address = person.Address; // address == null (incorrect) 

इसके अलावा, मैं एसक्यूएल प्रोफाइलर को झुका और मैं देख सकता हूँ कि एफई भी दूसरे मामले में पता आलसी लोड करने का प्रयास नहीं कर रहा है - यह सिर्फ अशक्त देता है।

मैं किसी दस्तावेज़ को ढूंढने में असमर्थ रहा हूं जो कहता है कि ईएफ आलसी लोड नहीं करता है-एक-शून्य-या-एक नेविगेशन गुण। क्या यह डिज़ाइन द्वारा है, क्या यह एक बग है, या क्या मैं कुछ गलत कर रहा हूं?

मैंने एंटिटी फ्रेमवर्क 5 और एंटिटी फ्रेमवर्क 6 अल्फा 3 दोनों के साथ इसका परीक्षण किया और उसी परिणाम प्राप्त किए।

+1

मेरे लिए काम करता है। क्या आप निश्चित हैं कि 'ProxyCreationEnabled' और' LazyLoadingEnabled' संदर्भ के लिए सच हैं? –

उत्तर

23

मुझे यह पता चला। इकाई वर्गों को आलसी लोडिंग के लिए public और गुण public virtual के रूप में घोषित किया जाना चाहिए। अर्थात।

public class Person 
{ 
    public int PersonId { get; set; } 
    public virtual Address Address { get; set; } 
} 

public class Address 
{ 
    public int PersonId { get; set; } 
    public virtual Person Person { get; set; } 
} 
+0

मैं भी इस समस्या पर आया था। क्या आपने इस पर कोई दस्तावेज ढूंढ लिया है? – ironic

+1

नहीं, दुर्भाग्य से मैंने नहीं किया। मैंने इसे परीक्षण और त्रुटि के माध्यम से समझ लिया। – Mike

+0

गतिशील प्रॉक्सी सामान की वजह से यह कुछ हद तक स्पष्ट है, लेकिन मैंने इसे भी नहीं देखा और इसे खोजना पड़ा। यहां आपके उत्तर के लिए धन्यवाद, यह अब काम कर रहा है;) – julealgon

1

एक और मुद्दा यह है कि कभी-कभी कारण हो सकता है, अगर एक नेविगेशन संपत्ति के लिए आभासी संशोधक जोड़ने के लिए भूल जाता

0

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

तुम भी dbcontext.Configuration.LazyLoadingEnabled = true जहां dbcontext DbContext का उदाहरण है की स्थापना करके व्यवहार को ओवरराइड कर सकते हैं।

संबंधित मुद्दे