एंटिटी फ्रेमवर्क 5 में चाइल्ड ऑब्जेक्ट की चाइल्ड ऑब्जेक्ट कैसे शामिल करें


138

मैं उपयोग कर रहा हूँ Entity Framework 5 code firstऔर ASP.NET MVC 3

मैं एक बच्चे के ऑब्जेक्ट को पॉप्युलेट करने के लिए चाइल्ड ऑब्जेक्ट प्राप्त करने के लिए संघर्ष कर रहा हूं। नीचे मेरी कक्षाएं हैं ..

आवेदन वर्ग;

public class Application
{
     // Partial list of properties

     public virtual ICollection<Child> Children { get; set; }
}

बाल वर्ग:

public class Child
{
     // Partial list of properties

     public int ChildRelationshipTypeId { get; set; }

     public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}

ChildRelationshipType वर्ग:

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

     public string Name { get; set; }
}

सभी अनुप्रयोगों को वापस करने के लिए भंडार में GetAll विधि का हिस्सा:

return DatabaseContext.Applications
     .Include("Children");

चाइल्ड क्लास में चाइल्डरेलेशनशिप टाइप क्लास का संदर्भ होता है। एक आवेदन के बच्चों के साथ काम करने के लिए मेरे पास कुछ इस तरह होगा:

foreach (Child child in application.Children)
{
     string childName = child.ChildRelationshipType.Name;
}

मुझे यहां एक त्रुटि मिलती है कि ऑब्जेक्ट संदर्भ पहले से ही बंद है।

मैं यह कैसे निर्दिष्ट करूं कि प्रत्येक बाल वस्तु में वह ChildRelationshipTypeवस्तु शामिल होनी चाहिए जैसे मैंने ऊपर किया था?


जवाबों:


256

यदि आप लाइब्रेरी शामिल करते हैं, तो आप System.Data.Entityउस Include()विधि के अधिभार का उपयोग कर सकते हैं जो एक स्ट्रिंग के बजाय एक लैम्ब्डा अभिव्यक्ति लेता है। फिर आप पथ के Select()बजाय लाइनक अभिव्यक्तियों वाले बच्चों पर हावी हो सकते stringहैं।

return DatabaseContext.Applications
     .Include(a => a.Children.Select(c => c.ChildRelationshipType));

6
जैसा कि ग्रीममीलर ने कहा, स्ट्रिंग्स का उपयोग करने की तुलना में दृढ़ता से टाइप की गई कक्षाएं स्थिरता बनाए रखने के लिए बेहतर हैं
रयान एमीज़

लांबा विधि किस संस्करण में उपलब्ध थी? मैं एक EF 4.0 कोडबेस पर अटक गया हूं..और खिचड़ी भाषा 'काम करने के लिए लामाओं को प्राप्त करता हूं। किसी भी इनपुट के लिए धन्यवाद।
ग्रेनडाकोडर

5
यह ईएफ 4 में काम करेगा, बस एक संदर्भ जोड़ना सुनिश्चित करेंSystem.Data.Entity;
रयान एमीज़

5
FYI करें - EF 6 में नाम स्थान हैMicrosoft.Data.Entity
ब्रैड

EF 5 का उपयोग करते हुए, मैं नहीं मिल सका। चुनाव (x => x.Child) लेकिन यह काम किया - Entities.UserProfile संग्रहीतProfile = db.UserProfiles .Include (s = - s.ShippingAddress) .Include (st => st.ShippingAddress) स्टेटप्रोविंस)। इनक्लूड (b => b.BillingAddress) .Include (bs => bs.BillingAddress.StateProvince) .FirstOrDefault (x = - x.UserId == userId);
जियोवानी मार्टिनेज

91

.NET Core में EF Core के साथ आप कीवर्ड का उपयोग कर सकते हैं ThenInclude:

return DatabaseContext.Applications
 .Include(a => a.Children).ThenInclude(c => c.ChildRelationshipType);

बच्चों के संग्रह से बच्चों को शामिल करें:

return DatabaseContext.Applications
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType1)
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType2);

6
धन्यवाद!!! वास्तव में मददगार! कभी-कभी आपको गलत सूचना मिल सकती है, बस इसे अनदेखा करें और निर्माण करें! :)
मुहिषन

एक अच्छा, मैं खोज रहा था .net कोर :)
एंडी क्लार्क

1
और क्या होगा अगर बच्चे एक संग्रह है और मुझे इसके तहत गुण शामिल करने की आवश्यकता है?
डोडब्रियन

उसके लिए एक अधिभार मिला। पहले स्पष्ट नहीं था।
डोडब्रियन

1
@ डोडब्रियन ओवरलोड क्या था? मैं घोंसला बनाने की कोशिश कर रहा हूं। ThenInclude, जहां बच्चा एक संग्रह है।
ग्रेग हार्डिन

22

मैंने निम्नलिखित कार्य पूरा किया और यह काम करता है:

return DatabaseContext.Applications
     .Include("Children.ChildRelationshipType");

76
जोरदार टाइप किया गया तरीका बेहतर है। जादू के तार रिफैक्टरिंग के लिए अच्छे नहीं हैं
ग्रीमएमिलर

2

जेनेरिक रिपॉजिटरी पैटर्न का उपयोग करने और इसके लिए एक सामान्य समाधान को लागू करने का एक अच्छा उदाहरण कुछ इस तरह दिखाई दे सकता है।

public IList<TEntity> Get<TParamater>(IList<Expression<Func<TEntity, TParamater>>> includeProperties)

{

    foreach (var include in includeProperties)
     {

        query = query.Include(include);
     }

        return query.ToList();
}

मैं उपरोक्त विधि कैसे कहूंगा? क्या आप एक उदाहरण प्रदान कर सकते हैं
Jamee

@Jamee -List <अभिव्यक्ति <Func <PersonObject, ऑब्जेक्ट >>> शामिल = नई सूची <एक्सप्रेशन <Func <PersonObject, ऑब्जेक्ट >>> (); शामिल हैं। जोड़ें (x => x.FirstName); प्राप्त करें <PersonObject> (includers);
gcoleman0828

1
और क्वेरी से आता है ...?
डग बियर्ड

क्षमा करें @DougBeard, आपके प्रश्न का अनुसरण नहीं कर रहा है।
gcoleman0828

1
@ gcoleman0828 आपके कोड स्निपेट में क्वेरी चर ऊपर। क्या यह जादुई रूप से तात्कालिक है? यह कहां से आता है?
डग बियर्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.