11

मैं इस मुद्दे पर अपना सिर तोड़ रहा हूं। मुझे इसके बारे में इंटरनेट पर कुछ मिला, लेकिन स्पष्ट जवाब नहीं। मेरी समस्या:ईएफ कोड के साथ वेबएपी पहले माता-पिता के बच्चे के संबंध में त्रुटि उत्पन्न करता है

मैं एक MVC3 वेब एप्लिकेशन के मॉडल अनुभाग में कक्षाओं के लिए है: ParentClass और ChildClass ParentClass पर है

मैं इस्तेमाल किया एफई कोड पहले, जो बड़े करीने से एक माता पिता उत्पन्न प्रकार सूची का एक गुण बच्चे डेटाबेस में मेरे लिए टेबल और एक बाल टेबल।

अब मुझे एक आरईएसटी सेवा चाहिए जो एक सूची या एकल पेरेंट क्लास देता है।

जब मैं संपत्ति को हटाता हूं तो माता-पिता से बच्चे को कोई समस्या नहीं है। लेकिन प्रोपर्टी बच्चों के साथ मुझे एक त्रुटि मिल रही है।

त्रुटि: "The type System.Data.Entity.DynamicProxies.ParentClass_A0EBE0D1022D01EB84B81873D49DEECC60879FC4152BB115215C3EC16FB8003A was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically."}

कुछ कोड:

क्लास:

 public class ParentClass 
{ 
    public int ID { get; set; } 
    public string Name {get;set;} 
    public virtual List<ChildrenClass> Children { get; set; } 

} 

public class ChildrenClass 
{ 
    public int ID { get; set; } 
    public string MyProperty { get; set; } 
} 

सेवा:

[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
[ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
public class MyService 
{ 

    static MyContext db; 
    public MyService() { db = new MyContext(); } 


    [WebGet(UriTemplate = "")] 
    public List<ParentClass> GetParents() 
    { 
     var result = db.Parents.ToList(); 
     return result; 

    } 

मैं परिणाम जब इस सेवा callinh नहीं मिलेगा। मैं क्या गलत कर रहा हूं?

उत्तर

12

मैं संदर्भ विन्यास में DisableProxyCreation पड़ा:

[OperationContract] 
[WebGet(UriTemplate = "")] 
public List<ParentClass> GetParents() 
{ 
    using (DBContext context = new DBContext()) 
    { 
     context.Configuration.ProxyCreationEnabled = false; 
     List<ParentClass> parents = context.Parents 
      .Include("Children") 
      .ToList(); 
     return parents; 
     } 
} 

यह मेरे लिए बाहर काम ठीक।

+0

बस जो मैं खोज रहा था। क्या आप इसे अक्षम करने के किसी भी डाउनसाइड्स के बारे में जानते हैं? – hooked82

+1

प्रॉक्सी से कई अच्छे टिंग हैं, अद्यतनों का ट्रैक रखते हुए और ऐसे। बयानों को शामिल करने से भूलने में कोई त्रुटि नहीं है। मेरे पास अभी भी प्रॉक्सी इकाइयों को क्रमबद्ध करने के लिए कोई समाधान नहीं है –

0

ऐसा लगता है कि यह आपके पीओसीओ के लिए प्रॉक्सी कक्षाओं को क्रमबद्ध कर रहा है, मेरी पहली सिफारिश proxydatacontractresolver का उपयोग करना होगा: http://msdn.microsoft.com/en-us/library/system.data.objects.proxydatacontractresolver.aspx

इसके अलावा मैं चीजों को स्पष्ट रूप से बताया जब वेब सेवा पर भेजने के लिए डेटा लोड हो रहा होने पर काम करेगा ... यानी

बदलें जनक वर्ग

public class ParentClass 
{ 
    public int ID { get; set; } 
    public string Name {get;set;} 
    public List<ChildrenClass> Children { get; set; } 

} 

आलसी लोड हो रहा है बंद करने के लिए अपनी सामग्री को बदलें: Disable lazy loading by default in Entity Framework 4

और स्पष्ट रूप से निर्दिष्ट करें कि तार पर डेटा भेजने पर आप क्या लोड करना चाहते हैं।

[WebGet(UriTemplate = "")] 
public List<ParentClass> GetParents() 
{ 
    var result = db.Parents.Include("Children").ToList(); 
    return result; 

} 

निम्नलिखित जवाब पर एक नज़र डालें: और अधिक उन्नत के लिए Entity Framework Code First - Eager Loading not working as expected? कॉल शामिल करें।

अनुभव से सलाह का एक टुकड़ा भी, मैं तार पर अपने डेटा वर्ग वापस नहीं लौटाता क्योंकि वे आपकी वेब सेवा के उपभोक्ता के लिए अनुबंध बनाते हैं। आपके पास कक्षाओं का एक और समूह होना सर्वोत्तम है जिसे आप अपने डेटा मानों को मैप करते हैं।

इस तरह यदि आपका डेटा वर्ग बदलता है, तो आपको स्पष्ट रूप से आवश्यक होने तक वेब सेवा क्लाइंट को बदलने की आवश्यकता नहीं है।

और पेजिंग का उपयोग करना महत्वपूर्ण है यदि आप माता-पिता या बाल कक्षाओं में 1000 पंक्तियों की अपेक्षा कर रहे हैं अन्यथा आप एन + 1 चयन के साथ समाप्त होते हैं, देखें: What is SELECT N+1?

+1

मैंने DataContractResolver की कोशिश की है, लेकिन इससे मदद नहीं मिली। अक्षमप्रदर्शन ने मदद की। लेकिन अगर मैं सही ढंग से समझता हूं तो मुझे सेवाओं में उपयोग करने के लिए कक्षाओं से डाटाबेस से पीओसीओ को भरना चाहिए। लेकिन इसका मतलब यह नहीं है कि प्रत्येक ऑब्जेक्ट को डुप्लीकेट करने की आवश्यकता है, जिसका अर्थ है साइट के भीतर उपयोग के लिए एक अभिभावक क्लास और व्यापार तर्क और सेवा में उपयोग के लिए एक अलग पेरेंट क्लास। क्या वह बहुत अधिक डुप्लिकेटिंग कोड नहीं है? – Mounhim

+0

हम अपने संसाधन मॉडल को हमारे डोमेन मॉडल से अलग करने के लिए डीटीओ और ऑटोमैपर का उपयोग कर रहे हैं। इसके लिए कई फायदे हैं जिनमें अलग-अलग सत्यापन और अलग-अलग/अलग-अलग संरचनाएं – suing

+0

एन/पीएलओओ को एन अलग-अलग उपयोगों के लिए डुप्लिकेट करने के लिए अक्सर अधिक होती है, जिसमें जोड़ों/xlats के योजक कार्य और रखरखाव शामिल हैं। कई डेवलपर्स एक बार फिर अपने पीओसीओ को सावधानीपूर्वक परिभाषित करने का दृष्टिकोण लेते हैं और फिर डेटा ट्रांसफर और डेटा एक्सेस दोनों के लिए विशेष रूप से छोटी परियोजनाओं पर उनका उपयोग करते हैं। यदि ऐसा समय आता है जब यह अब काम नहीं करता है (स्कीमा परिवर्तन, रिफैक्टर, इत्यादि) तो नए पीओसीओ को परिभाषित किया जाना चाहिए और मैपिंग आवश्यकतानुसार किया जाना चाहिए। इस प्रकार का शिफ्ट/रिफैक्टर वेब क्लाइंट को बिल्कुल प्रभावित नहीं करता है, यह कक्षा पुस्तकालयों के .NET उपभोक्ताओं के लिए वास्तव में एक समस्या है। जैसे बाइनरी आश्रितों। –

0

कुछ परिस्थितियों में एक सरल समाधान एक रैपर वर्ग का उपयोग करना है ताकि सभी गुण सामने आए हैं।

आमतौर पर आप अपने कंट्रोलर कक्षाओं में ऑब्जेक्ट कॉन्टेक्स्ट या डीबीकॉन्टेक्स्ट का उपयोग नहीं करेंगे, इसलिए पहले की परत (बिजनेस या सर्विस लेयर) में आप डीबी से व्यू मॉडेल स्टाइल ऑब्जेक्ट्स में आने वाली ऑब्जेक्ट्स से त्वरित अनुवाद कर सकते हैं, एमवीसी ऐप में आप जो भी करेंगे, उसके समान, लेकिन उन्हें एक दृश्य पर पास करने के बजाय आप उन्हें कॉलर पर वापस कर दें।

शायद आप इसे सभी मामलों में उपयोग नहीं कर सकते हैं, लेकिन अक्सर यह एक व्यावहारिक समझौता है।

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