2012-04-11 10 views
9

मेरे पास मेरे कोड में एक विशिष्ट क्वेरी है जिसे सभी संबंधित इकाइयों (दोनों -> 1 एफके और -> एन एफके) को लोड करने की आवश्यकता है क्योंकि संदर्भ ठीक उसी के बाद निपटान किया जाएगा ।ईएफ कोड प्रथम: वैकल्पिक संबंधों पर काम नहीं करना

मैंने एक सामान्य "क्वेरी" विधि बनाई है जो params Expression<Func<MyItem, object>>[] includes लेता है और फिर आंतरिक रूप से उन्हें चेन करता है। वह हिस्सा ठीक काम करता है।

क्वेरी इस तरह दिखता है:

var item = facade.Query<MyItem>(
       c => c.Childs.Select(x => x.Parent), 
       c => c.Childs.Select(x => x.SubChild1), 
       c => c.Childs.Select(x => x.SubChildNotWorking), 
       c => c.Childs.Select(x => x.SubChild2), 
       c => c.Childs.Select(x => x.SubChild3), 
       c => c.Childs.Select(x => x.SubChildrens) 
       ).FirstOrDefault(c => c.Name == name); 

काम नहीं कर संपत्ति (SubChildNotWorking के विन्यास में रखा) के लिए मानचित्रण:

this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey); 
सब शामिल

, केवल SubChildNotWorking नहीं करता ' वास्तव में काम नहीं करते हैं। डीबगर के साथ लौटे ऑब्जेक्ट का निरीक्षण करते समय, मैं सभी गुणों पर प्रॉक्सी देखता हूं। प्रॉक्सी खोलना मुझे अन्य सभी रिश्तों के लिए सही डेटा देता है, और SubChildNotWorking संपत्ति के लिए "ऑब्जेक्ट कॉन्टेक्स्ट को पहले से ही अपवाद का निपटारा कर दिया गया है"।

एकमात्र अंतर जो मैं स्पॉट करने में सक्षम था वह यह है कि SubChildNotWorking एक निरर्थक एफके (डीबी पर निरर्थक कॉलम और dbcontext में वैकल्पिक कॉन्फ़िगरेशन के साथ) है जबकि अन्य सभी गैर-अनुपलब्ध FKs WithRequired के साथ कॉन्फ़िगर किए गए हैं।

डेटाबेस एक विरासत डीबी भी है जो पहले कोड के साथ नहीं बनाया गया है और इसके सम्मेलनों का पालन नहीं करता है, मैंने अभी डीबीकॉन्टेक्स्ट में मैपिंग की है। बाकी सब कुछ ठीक काम करता है।

मैं यह पता लगाने की कोशिश कर रहा हूं कि उत्सुक लोडिंग शून्य से एफके पर काम नहीं करती है लेकिन मुझे इसके बारे में कोई दस्तावेज नहीं मिला।

क्या यह एक बग, या इच्छित व्यवहार है? लेकिन सबसे अधिक, मैं इसे कैसे हल करूं?

धन्यवाद।

+0

अगर आप केवल 'अन्य subchildren बिना SubChildNotWorking' शामिल क्या होता है? क्या यह तब काम करता है? – Slauma

+0

नहीं। या तो काम नहीं करता है। –

+1

क्या आप जांच सकते हैं कि एसक्यूएल सही दिखता है ('var sql = facade.Query (c => c.Childs.Select (x => x.SubChildNotWorking) के साथ)। ToString();') और मैन्युअल रूप से क्वेरी का परीक्षण करें एसएसएमएस अगर यह अपेक्षित परिणाम पंक्तियों को वापस करता है। – Slauma

उत्तर

0

आप अपने वर्ग (संस्थाओं) पर

[DataContract] 

परिभाषित किया? यदि हां, तो मत भूलना

[DataMember] 

के साथ अपने SubChild टिप्पणी करने के लिए या इसे लोड लेकिन प्रदर्शित नहीं जब आप संस्थाओं पर अपने GET कॉल प्रदर्शन खत्म हो सकता है।

0

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

var someEntity = context.someEntities.Find(1); 
context.Entry(someEntity).Reference(e => e.EntityWithFKNullable).Load(); 

या छोटा संस्करण:: आप इसे, प्रसंग पर सीधे लोड उदाहरण के लिए कोशिश कर सकते हैं

context.EntitiesWithFKNullable.Load(); 
संबंधित मुद्दे