2012-10-02 9 views
7

पर्यावरणएफई/LINQ कैसे बच्चे संस्थाओं को शामिल करने के जब वहाँ एक द्विदिश संबंध

मैं फ्रेमवर्क 4.0 पर इकाई की रूपरेखा 5 का उपयोग कर रहा है। (इसका मतलब है कि मैं वास्तव में ईएफ 4.4 का उपयोग कर रहा हूँ)। इकाइयों के रूप में मैं एसटीई (सेल्फ ट्रैकिंग एंटिटीज) का उपयोग करता हूं क्योंकि मैं एन-टियर एप्लिकेशन में काम कर रहा हूं। हम डेटाबेस संचालित दृष्टिकोण का उपयोग करते हैं क्योंकि बाद में गेम में ईएफ पेश किया गया था।

प्रसंग

2 संस्थाओं है कि दोनों एक दूसरे के लिए एक नेविगेशन संपत्ति है की है। (एंटिटीए में एंटिटीबी के लिए एक नेविगेशन प्रॉपर्टी है, और एंटिटीबी एंटिटीए में एक है)। संबंध 'EntityA> One-TO-Many> EntityB' है। जब मैं एक LINQ अभिव्यक्ति के माध्यम से बाल संस्थाओं को लोड करना चाहता हूं, तो मुझे INCLUDE (STE => उत्सुक लोडिंग) का उपयोग करने की आवश्यकता है क्योंकि मैं सभी डेटा को कई स्तरों को पार कर दूंगा।

कोड

यहाँ अपने EntityB बच्चों के साथ EntityA कॉल करने के लिए मेरे कोड है।

using (var ctx = new MyEntities()) 
{ 
    var result = (from s in ctx.EntityA.Include("EntityB") 
        where s.Id = 11111 
        orderby s.TimeUpdated descending 
        select s) 
       .Take(10) 
       .ToList(); 
    return result; 
} 

त्रुटि

System.StackOverflowException {अभिव्यक्ति का मूल्यांकन नहीं कर सकता क्योंकि वर्तमान धागा एक ढेर अतिप्रवाह स्थिति में है।}

कोई त्रुटि है जब मैं हटाने 'शामिल'। मुझे लगता है कि कारण सरल है। मैं एंटीटीए को चाइल्ड रिकॉर्ड्स एंटीटीबी के साथ लोड करना चाहता हूं, एंटिटीबी रिकॉर्ड हर बार अपने माता-पिता एंटिटीए को लोड करना चाहता है, और एंटिटीए ... मुझे लगता है कि हर कोई अनंत लूप को समझता है।

मेरे समाधान या विकल्प

  • मैं अपने edmx फ़ाइल के पास जाकर EntityB में EntityA के लिए नेविगेशन संपत्ति को हटा दें। अगर अब मैं एंटिटीए के बारे में डेटा लोड करना चाहता हूं, जबकि मेरे पास मेरे निपटारे में एंटिटीबी है। मुझे एक अलग डीबी अनुरोध करने की ज़रूरत है और मेरे पास 2 अलग-अलग ऑब्जेक्ट्स हैं जिन्हें मुझे अपने स्तरों को कम करना है।
  • शामिल करने से बचें, एंटीटीए को अलग से लोड करें और इसे मेरे एंटिटीबी की नेविगेशन प्रॉपर्टी में दबाएं जो मेरी एंटीटीए को संदर्भित करता है।

सवाल

वहाँ बेहतर विकल्प हैं या मेरी स्थिति में इसे ठीक करने के दृष्टिकोण? क्या मुझे अपने विकल्पों में से एक के साथ प्रस्तावित किया जाना चाहिए या नहीं? क्योंकि मैं एक बेहतर और क्लीनर समाधान की उम्मीद कर रहा था।

मैं अपना समय

इयान

+1

+1 आप के लिए एक बहुत अच्छा (1) प्रश्न के लिए की है। –

+0

मैंने ईएफ 5 (विजुअल स्टूडियो 2012) में अपनी समस्या को पुन: पेश करने का प्रयास किया और मुझे कोई त्रुटि नहीं मिली। क्या कोई और चीज है जो आपकी समस्या का कारण बन सकती है? क्या यह एक साधारण पॉको सेटअप के साथ काम कर रहा है? (Sidenote .. मैंने पहले एसटीई के साथ काम किया है और अब मैं वास्तव में उनसे बचने की कोशिश कर रहा हूं। क्या आप वाकई एसटीई का उपयोग करना चाहते हैं?) –

+0

मैं त्रुटि को पुन: उत्पन्न नहीं कर सकता (ईएफ 5, .NET 4.0)। क्या स्टैकट्रैक पोस्ट करना संभव है और शायद संवेदनशील डेटा खाली हो सकता है? –

उत्तर

1

मैंने ईएफ 5 (विजुअल स्टूडियो 2012) में अपनी समस्या को पुन: पेश करने का प्रयास किया और मुझे कोई त्रुटि नहीं मिली। क्या कोई और चीज है जो आपकी समस्या का कारण बन सकती है? क्या यह एक साधारण पॉको सेटअप के साथ काम कर रहा है?

मैं भी ध्यान रखें कि STE की आप काफी सिरदर्द दे सकते हैं चाहता था। मैंने पहले एसटीई के साथ काम किया है और अब मैं वास्तव में उनसे बचने की कोशिश कर रहा हूं। क्या आप वाकई एसटीई का उपयोग करना चाहते हैं?

इसके बजाय का उपयोग कर STE की आप सादे पुराने डीटीओ का उपयोग कर सकते हैं की

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

0

मैं यहाँ आया था आप "आप Include उपयोग कर सकते हैं" करने के लिए लेकिन स्पष्ट रूप से यह इस स्थिति में आप मदद नहीं करता है कहने के लिए के लिए धन्यवाद।

  1. हम foreach का उपयोग करके Load संचालन का उपयोग करें और बच्चों को मैन्युअल लोड कर सकते हैं:

    जैसा कि मैंने इंटरनेट पर पढ़ा आमतौर पर जब हम पर शक (या) अनंत लूप मामले, वहाँ कुछ समाधान है।

  2. हम अपने आप से डेटाबेस view that is a recursive query बना सकते हैं (और इसकी इकाई का उपयोग कर सकते हैं)।
+0

- 1. लोड ऑपरेशंस लागू नहीं किए जा सकते हैं क्योंकि मेरे नेविगेशन गुण नहीं हैं _EntityCollections _ लेकिन _TrackableCollection _ - 2. यह मेरे संदर्भ के लिए लागू नहीं होता है। उदाहरण के लिए, मैं आसानी से अभिभावक इकाई (EntityA) तक पहुंच बनाना चाहता हूं और इसे अपने EntityB के क्षेत्र के रूप में सहेजना चाहता हूं। मैंने 'context.LoadProperty (EntityB, "EntityA") का परीक्षण किया है, लेकिन यह भी एक ही StackOverflowException को उत्पन्न करता है। युक्तियों के लिए धन्यवाद –

0

see this

लेकिन मैं अपडेट 4 इंस्टॉल किया है और डिबग नहीं कर सकते

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