2010-05-27 14 views
6

इकाई फ्रेमवर्क (विशेष रूप से ईएफ 3.5, लेकिन यदि यह ईएफ 4 में मौजूद है तो यह मुझे अपग्रेड करने का कारण देता है) क्या आलसी लोड करना केवल संग्रह का हिस्सा है? मैं भी इस गलत के पास आ रहा हूं, इसलिए मैं सुझावों के लिए खुला हूं। मेरे टेबल/संस्थाओं कुछ ऐसा दिखाई:आलसी लोड एक इकाई फ्रेमवर्क इकाई मानदंड मानदंड

Person   PersonMeal   Meal 
------ 1---* ---------- *---1 ----- 
ID    ID     ID 
...    PersonID    ... 
        MealID 
        Value 
        ... 

मैं Person वस्तुओं है कि एक संग्रहीत प्रक्रिया के माध्यम से इकाई की रूपरेखा के माध्यम से पुनः प्राप्त किया गया है की एक सूची है। मेरे पास एक दृश्य है जो एक समय में केवल एक Meal दिखाता है, इसलिए मुझे केवल उस भोजन से संबंधित जानकारी चाहिए। वर्तमान में मेरे पास ऐसा कोड है जो इस तरह दिखता है:

Function GetPersons() As List(Of Person) 
    Dim personList = context.StoredProcedureCall(param1, param2, param3).ToList() 
    personList.ForEach(Function(x) LazyLoadProperties(x)) 
    Return personList 
End Function 

' Work around function because VB lambdas don't take Sub's 
Function LazyLoadProperties(ByVal person As Person) As Object 
    If (Not person.PersonMeal.IsLoaded) Then 
     person.PersonMeal.Load() 
    End If 
    Return Nothing 
End Function 

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

+0

क्या व्यक्ति के पास 'पर्सनल' के साथ कई से अधिक रिश्ते हैं और 'पर्सनल' के पास आपके प्रश्न में दिखाए गए अनुसार 'भोजन' के साथ कई सारे रिश्ते हैं? या 'व्यक्ति' के बजाय 'व्यक्ति' के साथ कई से अधिक संबंध हैं, जबकि 'पर्सनल' कनेक्टिंग टेबल है? यदि हां, तो 'PersonMeal' के लिए उत्पन्न इकाई नहीं होनी चाहिए। हालांकि, मैंने 'Value' फ़ील्ड को भी देखा है। क्या आप अपनी डेटा संरचना को थोड़ा सा स्पष्ट कर सकते हैं? आपके ईडीएम का एक स्क्रीनशॉट उपयोगी हो सकता है, साथ ही साथ आपकी डेटाबेस संरचना भी हो सकती है। – Yakimych

+0

@Yakimych आप सही हैं, यह व्यक्ति के साथ व्यक्ति और भोजन के बीच एक एम 2 एम है जो कनेक्टिंग टेबल/इकाई है। –

+0

@ Agent_9191 - ठीक है, उस स्थिति में केवल 'PersonEntity' तालिका होनी चाहिए, लेकिन कोई इकाई उत्पन्न नहीं हुई है। 'व्यक्ति' इकाई में 'भोजन' का संग्रह होना चाहिए और 'भोजन' इकाई में 'पीपुल्स' का संग्रह होना चाहिए। क्या आपने अपना मॉडल डेटाबेस से बनाया है या इसे खुद डिज़ाइनर में बनाया है? और 'मूल्य' संपत्ति क्या है (यही वजह है कि ईएफ 'व्यक्तिमेल' इकाई उत्पन्न कर रहा है)? – Yakimych

उत्तर

2

इस मामले में, बजाय Load विधि का उपयोग कर के, तो आप सिर्फ डेटाबेस अपने डेटा के लिए क्वेरी कर सकते हैं:

Function GetPersons() As List(Of Person) 
    Dim personList = context.StoredProcedureCall(param1, param2, param3).ToList() 

    Dim person As Person 
    For Each person in personList 
     person.PersonMeals = From pm in context.PersonMeals.Include("Meal") 
          Where pm.Person.Id == person.Id And pm.Meal.Id == Meal_ID 
          Take 1 
    Next person 

    Return personList 
End Function 

मुझे लगता है कि person.PersonMeals एक संग्रह है, अन्यथा आप FirstOrDefault बजाय Take उपयोग कर सकते हैं।

इस क्वेरी में हम मूल रूप से PersonMeals इकाइयों (Meal के साथ) का चयन करते हैं, जिसमें लूप और वर्तमान आईडी आईडी में मौजूदा व्यक्ति के रूप में व्यक्ति आईडी होती है। यदि आपके डीबी में दूषित डेटा नहीं है (एक ही व्यक्ति आईडी-मीलिड संयोजन के साथ कई पंक्तियां), तो 0 या 1 परिणाम होंगे, जो आपके PersonMeals संपत्ति में लिखे जाएंगे।

+0

पीएस .: मेरे वीबी के लिए खेद है। – Yakimych

+0

एक समाधान के सुरुचिपूर्ण के रूप में नहीं, जैसा कि मैं उम्मीद कर रहा था, लेकिन यह काम करता है। –

0

याकिमिच का जवाब काम करना चाहिए, लेकिन कोड में कुछ गलतियां थीं।

सही सिंटैक्स होना चाहिए:

Private Function GetPersons() As List(Of Person) 
    Dim personList As List(Of Person) = Context.StoredProcedureCall(param1, param2, param3).ToList() 
    For Each p In personList 
     Dim pId As Integer = p.Id 
     p.PersonMeals = (From pm As PersonMeal In context.PersonMeals.Include("Meal") 
         Where (pm.Person.Id = pId And pm.Meal.Id = Meal_ID) Take 1).ToList 
    Next 
    Return personList 
End Function 

मुझे आशा है कि यह मदद करता है।

1

आपका प्रश्न बहुत स्पष्ट था: क्या यह संभव है आलसी संग्रह का केवल एक हिस्सा लोड करें और उत्तर नहीं है! ईएफ 1 में नहीं और न ही ईएफ 4 में। बीटीडब्ल्यू, अगर अंतिम भोजन विषय है, तो इस से पूछताछ शुरू करें! व्यक्ति और वहां भोजन को पुनः प्राप्त करने के बजाय, अंतिम भोजन और उससे जुड़े व्यक्ति को पुनः प्राप्त करें।

+0

बस स्पष्ट करने के लिए - ईएफ संग्रह के आलसी लोड भाग के लिए एक आउट ऑफ़ बॉक्स बॉक्स प्रदान नहीं करता है। और आलसी लोडिंग का मतलब है कि 'भोजन' संग्रह 'व्यक्ति' के साथ एक साथ लोड नहीं होता है, बल्कि 'पीपुल्स' लोड होने के कुछ समय बाद। हालांकि, आप 'भोजन 'के लिए पूछताछ करके स्पष्ट रूप से हासिल कर सकते हैं। इस प्रकार, मैं केवल स्पष्ट रूप से यह नहीं कहूंगा कि यह संभव नहीं है। – Yakimych

+0

उत्तर क्यों नहीं है? मुझे लगता है कि इस समस्या को हल करने के लिए कुछ लागू करने के लिए ईएफ टीम को मुश्किल नहीं है। –

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