24

मैं एएसपी .NET एमवीसी दुनिया में काफी नया हूं। हो सकता है, यही कारण है कि मैं खुद को, मेरे लिए, एक परेशान समस्या का कारण बता सकता हूं।एंटीटी फ्रेमवर्क रिक्त लोगों की बजाय शून्य सूची <> क्यों लौटाता है?

मेरे पास वन-टू-कई रिलेशनशिप वाला एक वर्ग है।

class MyClass{ 
    public List<OtherClass> otherClasses {get;set;} 
} 

जब मैं इस वर्ग का एक उदाहरण बने रहा हूँ, मैं भरने यह एक खाली सूची <>

MyClass myClass = new MyClass(){ otherClasses = new List<OtherClass>() } 
context.myClass.Add(myClass); 
के साथ संबंध है

समस्या यह है कि, जब मुझे लगता है कि उदाहरण के पुनः प्राप्त करने के लिए, और के लिए कोशिश किसी भी कारण से, मैं उस सूची तक पहुंचने का प्रयास करता हूं, सिस्टम मुझे एक नल संदर्भ अपवाद देता है ...

मेरा प्रश्न है: क्यों ईएफ खाली की बजाय खाली सूचियों को वापस नहीं करता है? विशेष रूप से इस मामले में, कि मैं इसे एक खाली सूची के साथ जारी रख रहा हूं?

अगर उदाहरण शून्य हैं तो सत्यापन से बचने का कोई तरीका है?

+0

आप इकाई ढांचा वर्ग क्या है? –

उत्तर

21

आपको अपनी इकाई को उन सूचियों को कन्स्ट्रक्टर में बनाना चाहिए। ईएफ निर्भर संग्रह नहीं बनाता है, और इकाई को ऐसा करने की अपेक्षा करता है।

तो, आपके मामले में, आप अपने इकाई इस तरह होगा:

class MyClass{ 
    public List<OtherClass> _otherClasses {get;set;} 

    public MyClass() { 
     _otherClasses = new List<OtherClass>(); 
    } 
} 
+0

यह निश्चित रूप से मेरी समस्या हल करता है! आपकी सहायताके लिए धन्यवाद! तो ईएफ निरंतर जानकारी के साथ लोड करने से पहले ऑब्जेक्ट कन्स्ट्रक्टर को कॉल करता है, है ना? –

+0

नहीं, ईएफ कन्स्ट्रक्टर को "कॉल" नहीं करता है। सी # करता है। जब भी कोई वस्तु बनाई जाती है, तो निर्माता को बुलाया जाता है।यहां तक ​​कि जब ईएफ डीबी से वस्तुओं को पूरा करता है। –

+0

समझ गया! धन्यवाद! –

16

otherClasses संग्रह वर्चुअल बनाएं। यह संग्रह को आलसी लोड करने के लिए ईएफ सक्षम करेगा।

class MyClass{ 
    public virtual List<OtherClass> otherClasses {get;set;} 
} 

अन्यथा Include विधि के साथ उत्सुक लोडिंग का उपयोग करें।

context.myClass.Include(m => m.otherClasses).SingleOrDefault(m => m.Id == foo); 
+1

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

+0

सर्कुलर संदर्भ समस्याओं के लिए, आप बैक-लिंकिंग नेविगेशन प्रॉपर्टी को धारावाहिक होने से रोकने के लिए 'JsonIgnore' जैसी विशेषताओं का उपयोग कर सकते हैं। – Jess

0

तो, अगर मैं सही ढंग से समझ, आप एक खाली List<OtherClass> संदर्भ के लिए जोड़ रहे हैं और फिर इसे प्राप्त करने का प्रयास।

मुझे लगता है कि आपको इस बारे में सोचना होगा कि संदर्भ कैसे ट्रैक करेगा और इसकी संदर्भ में मौजूद इकाइयों को क्वेरी करेगा। यह आमतौर पर इकाई के Key द्वारा किया जाता है। आपके उदाहरण में, आपने इकाई को Key नहीं दिया है, इसलिए संदर्भ में इकाई पर संभाल नहीं है।

इसलिए, जब आप क्वेरी करते हैं, तो संदर्भ किसी ऑब्जेक्ट को नहीं ढूंढता है और शून्य देता है।

यदि आप एक नई इकाई शुरू करना चाहते हैं, तो मैं इसे कम से कम Key (आमतौर पर आईडी प्रॉपर्टी) देने की अनुशंसा करता हूं, और फिर जब आप बाद में खोजते हैं तो उस कुंजी द्वारा चयन करें।

उम्मीद है कि इससे मदद मिलती है।

+0

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

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