2015-11-04 10 views
8

मैं जेसन में एक (इकाई फ्रेमवर्क 6) इकाई को क्रमबद्ध करने की कोशिश कर रहा हूं। मैं यह सुनिश्चित कर रहा हूं कि प्रविष्टि AsNoTracking() विधि के माध्यम से serializing से पहले स्मृति में है, हालांकि मुझे एक त्रुटि मिलती है क्योंकि यह एक वैल्यू फॉर्म प्राप्त नहीं कर सकता है जो प्रविष्टि में संदर्भित है।इकाई से जेसन में क्रमबद्ध कैसे करें?

Inner Exception: When an object is returned with a NoTracking merge option, Load can only be called when the EntityCollection or EntityReference does not contain objects. 

Exception: JsonSerializationException: Error getting value from 'TABLE_X' on 'System.Data.Entity.DynamicProxies.... 

कोड:

List<Location> locations = new DbContext().Locations.Where(x => x.Type == 1).Take(5).AsNoTracking().ToList(); 
string s = JsonConvert.SerializeObject(locations, new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }); 

सभी मैं करना चाहता हूँ धारावाहिक इकाई के एक स्ट्रिंग वापसी है। मैं अन्य वस्तुओं, पूरी तरह से स्थान इकाई के बारे में चिंतित नहीं हूं।

जब मैं कनेक्शन की json serializing मैं त्रुटि प्राप्त निपटाने की कोशिश की और उसके बाद: The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.

मैं सिर्फ अपने सूची को क्रमानुसार करना चाहते हैं, मैं वापसी/किसी भी विदेशी निर्भरता को क्रमानुसार करने नहीं करना चाहती।

+0

आप की आवश्यकता क्यों है उस इकाई को क्रमबद्ध करने के लिए? – Marco

+0

क्योंकि मैं इसे बाद में जेएसएस फ़ाइल में स्टोर करना चाहता हूं। जैसे वैध/मूल्यवान डेटा के साथ यूनिट परीक्षण। –

+0

मैं पीओसीओ कक्षाओं को संग्रहित करना समझूंगा लेकिन अब ईएफ इकाइयां, लेकिन फिर आपके पास अलग-अलग आवश्यकताएं हो सकती हैं। – Marco

उत्तर

5

यह एक EF के गतिशील प्रॉक्सी मुद्दा आप उसे निष्क्रिय करने के लिए मुख्य रूप से क्या हो रहा है कि आपके JsonConvert की कोशिश कर रही है अपने कोड को अपने वर्ग कि DbContext

public class MyModelEntities : DbContext 
{ 
    public MyModelEntities() 
    { 
     //just disable it like this 
     Configuration.ProxyCreationEnabled = false; 
    } 
} 

से विरासत में

काम कर रहा है करने के लिए इस System.Data.Entity.DynamicProxies.Location_5E43C6C196972BF0754973E48C9C941092D86818CD94005E9A759B70BF6E48E6

प्रॉक्सी के कारण किसी ऑब्जेक्ट को क्रमबद्ध करें, जो नहीं पाया जा सकता क्योंकि यह गतिशील रूप से

बनाया गया है
+0

आपको बहुत बहुत धन्यवाद! –

1

यदि आप ग्राफ़ ऑब्जेक्ट करते हैं तो जटिल नहीं है, सरल पीओसीओ वर्ग बनाने के लिए अलग-अलग दृष्टिकोण हो सकता है, जो आपके Location से मैप किया जाएगा। मान लें LocationModel। इसे हाथ से मैप किया जा सकता है या उदाहरण के लिए ऑटोमैपर के साथ।

1

आपको आवश्यक इकाइयों को याद करने के लिए AsNoTracking विधि को कॉल करने की आवश्यकता नहीं है। ToList विधि उस नौकरी को करने जा रही है।

अब आपकी समस्या के बारे में, क्योंकि JSON serializer Location इंस्टेंस पर प्रत्येक प्रॉपर्टी तक पहुंचने का प्रयास कर रहा है और आप आलसी लोडिंग सक्षम होने के कारण ही अपने पूरे डेटाबेस के लिए पूछताछ समाप्त कर सकते हैं। तो, आप दो विकल्प हैं:

  1. Disable Lazy loading (के रूप में @BRAHIMKamel अनुशंसित)
  2. उपयोग JsonIgnore नेविगेशन गुण आप लोड किया जा नहीं करना चाहते से अधिक गुण।

व्यक्तिगत रूप से, मैं पहले एक पसंद करते हैं, और जब मैं कुछ विशिष्ट संबंधित संस्था के साथ एक इकाई लोड करने की जरूरत है, मैं eager loading का उपयोग क्वेरी में लोड करने के लिए:

context.Locations 
     .Include(l=>l.State)//eager loading an hypothetical related entity 
     .Where(x => x.Type == 1) 
     .Take(5) 
     .ToList(); 
संबंधित मुद्दे