2012-04-10 11 views
127

कोई विचार क्यों तोड़ सकता है?नए लेनदेन की अनुमति नहीं है क्योंकि सत्र में चल रहे अन्य धागे LINQ से Entity

foreach (var p in pp) 
{ 
    ProjectFiles projectFile = (ProjectFiles)p; 
    projectFile.Status = Constants.ProjectFiles_ERROR; 
    projectFile.DateLastUpdated = DateTime.Now; 
    context.SaveChanges(); 
} 

मैंने पढ़ा कि समस्या का समाधान, फोरैच लूप से पहले एक बार में परिणाम पुनर्प्राप्त करना है।

लेकिन क्या मैंने ऐसा नहीं किया? "पीपी" मेरे मामले में परिणाम का संग्रह है

+10

क्या एक पीपीक क्वेरी का परिणाम है? यदि ऐसा है, तो आपको अपने लूप को चलाने से पहले इसे डेटाबेस से डिस्कनेक्ट करने के लिए 'ToList()' करने की आवश्यकता हो सकती है। – SouthShoreAK

+0

हां यह है। ठीक है, मैं कोशिश करता हूं कि धन्यवाद –

+2

कॉल लूप के बाहर परिवर्तन सहेजें – Mohsin

उत्तर

321

pp परिवर्तनीय वस्तुओं का संग्रह नहीं है, यह एक गणक है जो वस्तुओं को वापस कर सकता है। जब आप गणनाकर्ता का उपयोग करते हैं, तो स्रोत को खुला रहता है।

संग्रह में गणनाकर्ता को समझने के लिए ToList विधि का उपयोग करें। यह गणनाकर्ता से सभी वस्तुओं को पढ़ेगा और स्रोत से कनेक्शन बंद कर देगा, ताकि आप अन्य चीजों के लिए कनेक्शन का उपयोग कर सकें।

foreach (var p in pp.ToList()) 
+14

भगवान आपको आशीर्वाद @ गफ !!! +1 –

+2

ग्रेट !! यह pp.ToArray() –

+2

रिकार्डो के साथ भी काम करता है, यह तब तक काम करता है जब तक यह IQueryable –

7

बात ये है कि आप db संस्थाओं का एक संग्रह से अधिक पुनरावृति करने के लिए एक एसक्यूएल कनेक्शन का उपयोग कर रहे हैं, तो परिवर्तन सहेजने के लिए एक और कनेक्शन का उपयोग कर रहा है। ऐसा इसलिए होता है क्योंकि आपकी कक्षाएं मूल रूप से "डीबी कनेक्शन" के एक उदाहरण के लिए "विवाहित" होती हैं और उन्हें किसी अन्य द्वारा बदला नहीं जा सकता है।

इसे पाने के लिए एक तरीका है कॉल करने के पहले अपने संग्रह पर। टोस्टिस्ट()।

और जब आप इसमें हों, तो लूप के कोड को तेज़ करने के बाद केवल context.SaveChages() पर कॉल करें।

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