2012-10-25 7 views
32

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

public class TagsController : ApiController 
{ 

     private BlogDataContext db = new BlogDataContext(); 

     // GET api/Tags 
     public IEnumerable<Tag> GetTags() 
     { 
      return db.Tags.AsEnumerable(); 
     } 
} 

मैं निम्नलिखित त्रुटि मिलती है:: जब मैं निम्न वेब api विधि निष्पादित करने के लिए नीचे दिए गए मैं निम्नलिखित त्रुटि संदेश प्राप्त प्रयास

'System.Data.Entity.DynamicProxies.Tag_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D' with data contract name 'Tag_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D: http://schemas.datacontract.org/2004/07/System.Data.Entity.DynamicProxies ' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.

मैं कुछ अतः लेख (article 1, article 2) पढ़ा है कि फिक्स निम्न विशेषता को जोड़ना है:

[DataContract (IsReference=true)]

लेकिन इसका कोई प्रभाव नहीं पड़ा है। [IgnoreDataMember] का उपयोग करने पर भी कोई प्रभाव नहीं पड़ता है। काम करने के लिए प्रतीत होता है कि एकमात्र विकल्प कॉन्फ़िगरेशन सेट करने के लिए है। PrroxyCreationEnabled गलत पर। क्या यह मेरा एकमात्र विकल्प है? क्या मैं कुछ भूल रहा हूँ?

नमूना POCO वस्तुओं:

टैग

[DataContract(IsReference = true)] 
public class Tag 
{ 
     public Tag() 
     { 
      this.Blogs = new HashSet<Blog>(); 
     } 

     [Key] 
     [DataMember] 
     public int Id { get; set; } 

     [DataMember] 
     public string Name { get; set; } 

     [IgnoreDataMember] 
     public virtual ICollection<Blog> Blogs { get; set; } 
} 

ब्लॉग

[DataContract(IsReference = true)] 
public class Blog 
{ 
    public Blog() 
    { 
     this.Tags = new HashSet<Tag>(); 
    } 

    [Key] 
    [DataMember] 
    public int Id { get; set; } 

    [DataMember] 
    public string Name { get; set; } 

    [IgnoreDataMember] 
    public virtual ICollection<Tag> Tags { get; set; } 
} 
+1

का समाधान होगा, और मैंने पाया के रूप में आप, और एरिक फिलिप्स, ने कहा है कि एकमात्र समाधान है। प्रॉक्सी निर्माण बंद करने के लिए। 'IgnoreDataMember' का कोई प्रभाव नहीं पड़ता है क्योंकि समस्या प्रॉक्सी पीढ़ी के साथ है, न कि 'टैग' के' आईसीओलेक्शन 'के क्रमिकरण। –

+0

मुझे एक ही समस्या है, आपने इसे कैसे हल किया? जब मैं प्रॉक्सी सृजन को अक्षम करता हूं तो मुझे माता-पिता के मान नहीं मिल सकते हैं, जिन्हें मुझे इसकी आवश्यकता है। कृपया मेरी मदद करो। –

उत्तर

79

जब आप देखते हैं एक वस्तु की तरह:

System.Data.Entity.DynamicProxies.Tag_FF17EDDE6893000F7672649A39962DB0CA591C699DDB73E8C2A56203ED7C7B6D

यह क्या सामान्य रूप से एक POCO वस्तु पर विचार किया जाएगा करने के लिए एक प्रॉक्सी के क्रम एफई जनरेट किया गया संस्करण है।

इकाई फ्रेमवर्क ने इस ऑब्जेक्ट को बनाया है क्योंकि जब ऑब्जेक्ट बदल गया है तो यह ट्रैक करता है, इसलिए जब आप .SaveChanges() पर कॉल करते हैं तो यह अनुकूलित कर सकता है कि क्या करना है। इसका पतन यह है कि आप वास्तव में परिभाषित विशिष्ट वस्तु का उपयोग नहीं कर रहे हैं, इस प्रकार डेटा अनुबंध और फ्रेमवर्क (Json.net) उनका उपयोग नहीं कर सकते क्योंकि वे आपकी मूल POCO ऑब्जेक्ट करेंगे।

इस वस्तु लौटने से एफई को रोकने के लिए आपके पास दो विकल्प (एटीएम) है:

पहले, Try turning off Proxy object creation on your DbContext

DbContext.Configuration.ProxyCreationEnabled = false; 

यह प्रत्येक क्वेरी के लिए विशिष्ट DbContext पर प्रॉक्सी ऑब्जेक्ट्स को पूरी तरह अक्षम कर देगा। (यह ऑब्जेक्ट कॉन्टेक्स्ट में कैश्ड ऑब्जेक्ट को प्रभावित नहीं करता है)।

दूसरे, (AsNoTracking() साथ EntityFramework 5.0+ का उपयोग ProxyCreationEnabled अभी भी एफई 5 में उपलब्ध है।0 के साथ-साथ)

तुम भी

DbContext.Persons.AsNoTracking().FirstOrDefault(); 

या

DbContext.Persons. 
    .Include(i => i.Parents) 
    .AsNoTracking() 
    .FirstOrDefault(); 

के बजाय विश्व स्तर पर DbContext के लिए प्रॉक्सी सृजन को निष्क्रिय करने में सक्षम होना चाहिए, यह केवल प्रति क्वेरी भी बंद हो जाती। (यह करता ObjectContext में कैश्ड वस्तु को प्रभावित है, यह कैश्ड नहीं होता)

+4

और मैंने सोचा कि कोड फर्स्ट को पीओसीओ के लिए डिज़ाइन किया गया था ... –

+1

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

+0

आपका नायक !!! – Hugo

2

मैं प्रॉक्सी निर्माण inteact छोड़ना चाहते हैं, और पाया कि ProxyDataContractResolver का उपयोग कर मेरे लिए इस मुद्दे को हल करने के लिए लग रहा था। Wcf में इसका उपयोग करने के संदर्भ के संदर्भ में msdn देखें, जो वास्तव में वेबएपीआई नहीं है, लेकिन आपको सही रास्ते पर जाना चाहिए।

+1

क्या आप मुझे बताते हैं कि पॉको इकाइयों को sereialize करने के लिए ProxyDataContractResolver का उपयोग कैसे करें? एकमात्र उदाहरण जिसे मैं शामिल करने में कामयाब रहा, डब्ल्यूसीएफ और मैं यह नहीं समझ पाया कि यह कैसे काम करता है। –

0
db.Configuration.ProxyCreationEnabled = false; 

मैं ठीक उसी मुद्दा था आपकी समस्या

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