2015-02-22 6 views
16

डिबगिंग और खोज के तीन घंटों के बाद, मुझे उम्मीद है कि यहां किसी का जवाब है। इकाई फ्रेमवर्क (MySQL का उपयोग करके) निम्न अपवाद फेंकता है यदि मैं उत्तराधिकार में निम्न फ़ंक्शन को तुरंत कॉल करता हूं (उदा। < 0.1 सेकंड अलग)।इकाई फ्रेमवर्क "अप्रत्याशित कनेक्शन राज्य" अपवाद

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

हालांकि, कभी-कभी फ़ंक्शन बिना किसी समस्या के काम करता है। अपवाद पहले ToList() फोन पर फेंक दिया जाता है:

void InsertOrUpdateMaterials(List<Material> materials) 
{ 
    var id = GetUserId(); 
    var materialIds = materials.Select(x => x.MaterialId).ToList(); 

    // Remove old materials from DB 
    var oldMaterials = Db.Materials.Where(p => p.CreatedBy == id && 
      materialIds.Contains(p.MaterialId)).ToList(); // exception 
    Db.Materials.RemoveRange(oldMaterials); 
    Db.SaveChanges(); 

    // Replace previous materials with the new ones in list 
    Db.Materials.AddRange(materials); 
    Db.SaveChanges(); 
} 

अजीब तरह, यह त्रुटि विकास सर्वर पर कभी नहीं हुआ, इसलिए मैं कोई लाभ नहीं हुआ संभव विन्यास मुद्दों में देखा।

कभी कभी, इकाई की रूपरेखा फेंकता है:

System.Data.Entity.Core.EntityCommandExecutionException: वहाँ पहले से ही इस कनेक्शन जो पहले बंद होना चाहिए के साथ जुड़े किसी खुले DataReader है।

फिर से ToList() कॉल पर इंगित करता है। कोई विचार?

+4

यह देखना उपयोगी होगा कि 'डीबी' कहां से आ रहा है। मेरा अनुमान है कि यह वास्तव में सत्य बता रहा है - डीबी पर प्रारंभिक कनेक्शन खोलने के बीच, और आप 'ToList' निष्पादित करते हैं (आपको यहां अपवाद मिलता है क्योंकि यह तब होता है जब क्वेरी डेटाबेस के विरुद्ध "भौतिक" होती है) कनेक्शन की स्थिति बदल गया है (बंद, आदि)। ईएफ संकेत दे रहा है कि आपको इसे संभालने के लिए 'स्टेट चेंज' को संभालना चाहिए (उदाहरण को फिर से खोलना या जो भी हो) –

+6

आपकी टिप्पणी ने मुझे समाधान ढूंढने में मदद की! धन्यवाद महोदय!! मैंने देखा कि 'डीबी' कहाँ से आ रहा था, और संदर्भ कैश किया जा रहा था। मैंने इसे हर बार एक नया संदर्भ शुरू किया और समस्या हल हो गई। वास्तव में आश्चर्य की बात है कि मैंने उस पर्ची को कैसे छोड़ दिया। – arao6

+3

@ arao6 देखभाल एक और विस्तृत उत्तर लिखने के लिए? FYI आप StackOverflow में अपने स्वयं के प्रश्न का उत्तर लिख सकते हैं। और, एफडब्ल्यूआईडब्ल्यू, मैं शायद इसे ऊपर उठाऊंगा :) – knocte

उत्तर

4

अन्य लोगों के लिए जो एक समान समस्या हो सकती हैं। उपर्युक्त टिप्पणियों के आधार पर ऐसा लगता है कि कोड कैश्ड डीबी-संदर्भ का उपयोग करता है। डीबी-संदर्भ के निर्माण के बाद डीबी कनेक्शन टूट गया (आवेदन में StateChange हैंडलर स्थापित किया गया था)। कनेक्शन टूटने के बाद एप्लिकेशन ने कैश किए गए डीबी-संदर्भ का उपयोग कुछ संचालन करने के लिए किया।

एक नया डीबी-संदर्भ बनाने से समस्या हल हो गई।

0

मुझे यह समस्या Effort.EF6 1.3.0 के साथ थी। मेरे लिए फिक्स NMemory निर्भरता को 1.1.0 से 1.1.2 तक अपडेट करना था।

+0

मुझे अभी भी NMemory 1.1.2 के साथ त्रुटि मिल रही है। – Roger

+0

क्या आप समान समांतरता समस्या को https://stackoverflow.com/a/47862865 के रूप में देख रहे हैं? – user326608

+1

मुझे यकीन नहीं है, मैं NUnit 3.7 का उपयोग कर रहा हूं। मैंने अपनी समस्या को बदल दिया जिस तरह से मेरे डीबी कॉन्टेक्स्ट को @Stephen Byrne के रूप में संभाला गया था। – Roger

0

मुझे Effort.EF6 का उपयोग कर एक ही समस्या थी, लेकिन NMemory अपडेट किया गया (user326608 सुझाया गया) ने मदद नहीं की। XUnit is executing tests in parallel by default since V2 बदलता है।

इस व्यवहार को अक्षम करने से यह मेरे लिए तय हो गया। AssemblyInfo.cs के लिए निम्न जोड़ें:

using Xunit; 
[assembly: CollectionBehavior(CollectionBehavior.CollectionPerAssembly)] 

हालांकि मैं एक समाधान के रूप में देखते, के रूप में इकाई परीक्षण एक दूसरे से स्वतंत्र होना चाहिए।

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