2012-02-13 16 views
14

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

उदाहरण के लिए:

मैं एक आभासी JobRole संपत्ति के साथ एक उपयोगकर्ता इकाई है:

public class User 
{ 
    public int Id { get; set; } 

    public virtual JobRole JobRole { get; set; } 
    public int JobRoleId { get; set; } 

    public string Name { get; set; } 
} 

मैं तो एक नया उपयोगकर्ता जोड़ें:

public User Add(User user) 
{ 
    var addedUser = _myContext.Users.Add(user); 
    myContext.SaveChanges(); 
    return addedUser; 
} 

नया उपयोगकर्ता के लिए वापस आ संदर्भ उसके बाद एक रेजर व्यू को पास किया जाता है, जहां यह जॉब रोल (जैसे जॉबरोलेनाम) प्रदर्शित करने का प्रयास करता है। इस बिंदु पर कि उपयोगकर्ता को दृश्य में पास किया गया है, इसमें:

  • JobRoleId एक पूर्णांक मान पर सही ढंग से सेट किया गया है।
  • JobRole = अशक्त

मैं तो JobRole आलसी-लोडेड, जब देखें द्वारा इस्तेमाल किया जा करने के लिए उम्मीद करेंगे, लेकिन यह एक अशक्त-संदर्भ अपवाद में नहीं है और परिणाम है।

क्या यह अपेक्षित व्यवहार है, या क्या नए जोड़े गए इकाइयों को आलसी लोड करने के लिए कोई तरीका है?

किसी भी विचार के लिए अग्रिम धन्यवाद।

पर्यावरण: इकाई फ्रेमवर्क 4.2 कोड-प्रथम का उपयोग करना। आलसी लोडिंग सक्षम।

+0

मैं इस समस्या थी और जवाब सही है। हालांकि, मेरा कोड डेटाबेस-पहले का उपयोग करता है। इसलिए मेरा सुझाव है कि आप शीर्षक संपादित कर रहे हैं ताकि भविष्य की खोज यहां और आसानी से उतर सके। –

उत्तर

20

कारण है कि:

context.ContextOptions.LazyLoadingEnabled = false; 

अगर यह काम नहीं करता, तो आप संपत्ति इस का उपयोग कर लोड कर सकते हैं DbSet.Add विधि वही ऑब्जेक्ट देता है जो इसे तर्क के रूप में पास कर दिया गया है, जो आपके मामले में प्रॉक्सी उदाहरण नहीं है इसलिए आलसी लोडिंग उपलब्ध नहीं है।

आप DbSet.Create विधि है, जो वापस आ जाएगी एक प्रॉक्सी उदाहरण, और फिर DbContext के माध्यम से बने पहले उसके गुण आवंटित का उपयोग कर User उद्देश्य यह है कि DbSet.Add के लिए पारित किया जा रहा है बनाना चाहिए।

यहाँ एक उदाहरण है:

public User Add(User user) 
{ 
    var newUser = _myContext.Users.Create(); 

    // Copy the property values from 'user' to 'newUser' e.g. 
    // newUser.Name = user.Name 

    _myContext.Users.Add(newUser); 
    myContext.SaveChanges(); 

    return newUser; 
} 
+7

बिल्कुल सही। मेरी समस्या हल हो गई - बहुत धन्यवाद। उपयोगकर्ता गुणों की प्रतिलिपि बनाने के लिए मैंने SaveChanges(): _myContext.Entry (newUser) से पहले एक पंक्ति जोड़ दी है। CurrentValues.SetValues ​​(उपयोगकर्ता); ठीक काम करने लगता है। – Appetere

+0

@Steve यह भी बेहतर है। मैं खुश हूं कि मैं मदद कर सका :) –

1

आप दो चीजों की कोशिश कर सकते, पहले एक उत्सुक लोडिंग लागू है: http://msdn.microsoft.com/en-us/library/dd382880.aspx

+0

मेरे प्रश्न का उत्तर देने के लिए समय निकालने के लिए धन्यवाद। हालांकि, आलसी लोडिंग को बंद करने से सब कुछ उत्सुक-भार नहीं बनता है - आपको इसके लिए "शामिल" बयानों की आवश्यकता होती है जो आइटम को पुनर्प्राप्त करते समय केवल लागू होते हैं, उन्हें नहीं जोड़ते हैं। मैं संपत्ति को मैन्युअल रूप से लोड कर सकता हूं लेकिन मैं वास्तव में यह समझने की कोशिश कर रहा हूं कि यह स्वचालित रूप से क्यों नहीं होता है। – Appetere

+0

कभी भी। आपका स्वागत है। =) –

+0

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

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