5

है, मैं एक डब्ल्यूसीएफ डेटा सेवा विकसित कर रहा हूं। जब मैं क्लाइंट साइड से इसे एक्सेस करने का प्रयास करता हूं, तो मुझे यह अपवाद मिलता है:ऑब्जेक्ट कॉन्टेक्स्ट उदाहरण का निपटारा किया गया है और अब उन परिचालनों के लिए उपयोग नहीं किया जा सकता है जिनके लिए कनेक्शन

ऑब्जेक्ट कॉन्टेक्स्ट उदाहरण का निपटारा किया गया है और अब कनेक्शन के लिए आवश्यक संचालन के लिए उपयोग नहीं किया जा सकता है।

कोड:

[WebGet] 
public IQueryable<Student> GetUsersByClassId(string classId) 
{ 
    Check.Argument.IsNotEmptyOrNull(classId, "classId"); 

    using (var db = new schoolContext(connectionString)) 
    { 
     ((IObjectContextAdapter)db).ObjectContext.ContextOptions.ProxyCreationEnabled = false; 
     ((IObjectContextAdapter)db).ObjectContext.ContextOptions.LazyLoadingEnabled = false; 

     var studentQry = from s in db.Student.Include("Class") 
         where s.Class.Id == classId 
         select s; 

     if(studentQry == null) 
      return new List<Student>().AsQueryable(); 
     else 
      return studentQry; 
} 
+1

आपको इसे वापस करने से पहले IQueryable का मूल्यांकन करना होगा, इसे एक आईनेमरेबल या इसी तरह से चालू करें, आप मूल रूप से आलसी संग्रह लौट रहे हैं, और फिर किसी के पास डेटा को पकड़ने का मौका मिलने से पहले अपने डेटाबेस कनेक्शन को दूर करना। –

उत्तर

15

मुझे लगता है समस्या ..., जो आप नहीं दिखा रहे हैं चिह्नित कोड में है।

इसे वापस करने से पहले अपनी क्वेरी का पूर्ण मूल्यांकन करना सुनिश्चित करें। उदाहरण के लिए, के बजाय सिर्फ करने के लिए:

return studentQry; 

कर प्रयास करें:

return studentQry.ToList(); 

संपादित करें:

अब आप अपने प्रश्न बदल दिया है कि प्रतिबिंबित करने के लिए है कि आप IQueryable<T> लौट रहे हैं IEnumerable<T> के बजाय, एक अलग मुद्दा है। अपनी विधि से IQueryable<T> लौटकर, आप सुझाव दे रहे हैं कि प्रकार को सर्वर पक्ष पर सीधे "पूछताछ" की जा सकती है।

हालांकि, डब्ल्यूसीएफ तार में इसे क्रमबद्ध कर रहा है, और एक ठोस कार्यान्वयन प्रकार का उपयोग करने की आवश्यकता है। IEnumerable<T> की अनुमति है, लेकिन IQueryable<T> नहीं है। आपको इसे एक प्रकार पर स्विच करना चाहिए जो पूरी तरह से मूल्यांकन करेगा ताकि परिणाम सही ढंग से पारित किए जा सकें।

+2

आपके सुझावों के लिए धन्यवाद। मुझे रिटर्न टाइप को आईनेमरेबल में बदलना पड़ा, फिर studentQry.AsEnumerable() या studentQry के बजाय studentQry.ToList() को वापस करना पड़ा। – Attilah

+0

बहुत बहुत धन्यवाद। तुमने मुझे बहुत सी सिरदर्द बचाया। – Attilah

+0

@ एटिलाह: मदद करने में खुशी;) मुझे खुशी है कि आपको यह मिल रहा है। –

2

शायद यह है कि क्लाइंट एक उप संपत्ति तक पहुंचने का प्रयास कर रहा है, उदाहरण के लिए यदि छात्र.क्लास एक और इकाई है और आप इसे क्लाइंट पर एक्सेस करने का प्रयास करते हैं। निर्दिष्ट करने की आवश्यकता है किसी उप उपखंड

2

यह आपके उपयोग का कारण बन रहा है। Linq क्वेरी मूल्यांकन से पहले DataContext का निपटारा किया जा रहा है। आप studentQry.ToList() वापस कर सकते हैं और देख सकते हैं कि यह काम करता है या नहीं। जो ऐसा नहीं करता है, तो कोशिश

List<Student> retValue; 
retValue = studentQry.ToList(); 
return retValue; 

अंत में, यह बदसूरत है, लेकिन अगर आप एक का उपयोग कर का उपयोग नहीं करते, तो इस समस्या नहीं होगी। इसे अंततः कचरा संग्रह द्वारा निपटान और साफ किया जाना चाहिए।

6

यह कथन का उपयोग करने के कारण है। जब आपका फ़ंक्शन निष्पादन समाप्त करता है, तो यह ऑब्जेक्ट संदर्भ का निपटारा करता है। जब परिणाम IQueryable गणना की जाती है, तो यह डिस्पोजेड ऑब्जेक्ट का उपयोग करने का प्रयास करती है, इसलिए आपको अपवाद मिलता है। उपयोग करके निकालें, अपने सेविस को IDISposable लागू करें और IDISposable में अपने ऑब्जेक्ट संदर्भ का निपटान करें। उद्देश्य()

+0

यह मेरी समस्या थी। सेवा का समय पूरा होने से पहले उपयोग करने का बयान मेरे ऑब्जेक्ट संदर्भ का निपटारा कर रहा था। मैंने उपयोग कथन हटा दिया और यह काम किया। – Flea