एंटिटी फ्रेमवर्क 6 में मल्टी-एसिक्स?


87

यह मेरा कोड है:

var banner = context.Banners.ToListAsync()
var newsGroup = context.NewsGroups.ToListAsync()
await Task.WhenAll(banner, newsGroup);

लेकिन जब मैंने फंक्शन को कंट्रोलर से कॉल किया। इसमें त्रुटि दिखाई गई

पिछले अतुल्यकालिक ऑपरेशन पूरा होने से पहले इस संदर्भ में एक दूसरा ऑपरेशन शुरू हुआ। यह सुनिश्चित करने के लिए 'प्रतीक्षा' का उपयोग करें कि इस संदर्भ में किसी अन्य पद्धति को कॉल करने से पहले कोई भी अतुल्यकालिक संचालन पूरा हो गया है। किसी भी उदाहरण के सदस्यों को धागा सुरक्षित होने की गारंटी नहीं है।

कृपया इस मुद्दे को हल करने में मेरी मदद करें।


मेरे पास 2 कार्य हैं। यदि मैं प्रत्येक कार्य को चलाऊं। यह सफलता है। लेकिन अगर मैं ऊपर मेरे कोड की तरह चलता हूं। यह त्रुटि है
एक एचवी

जवाबों:


119

अपवाद स्पष्ट रूप से बताता है कि एक समय में प्रति संदर्भ केवल एक अतुल्यकालिक ऑपरेशन की अनुमति है।

इसलिए, आपको या तो awaitएक समय में एक त्रुटि संदेश के रूप में उन्हें बताना होगा:

var banner = await context.Banners.ToListAsync();
var newsGroup = await context.NewsGroups.ToListAsync();

या आप कई संदर्भों का उपयोग कर सकते हैं:

var banner = context1.Banners.ToListAsync();
var newsGroup = context2.NewsGroups.ToListAsync();
await Task.WhenAll(banner, newsGroup);

33
बस एक नोट, अगर आपके पास एक आलसी चर है जो क्वेरी में संदर्भ का उपयोग करता है तब भी प्रतीक्षा के साथ ही वह त्रुटि को फेंक देगा, बस क्वेरी से पहले संपत्ति प्राप्त करें, यह पता लगाने के लिए एक दर्द था।
पेड्रो.किड

7
@ पेड्रो.किड: एक सामान्य नियम के रूप में, अतुल्यकालिक डीबी पहुंच के साथ आलसी लोडिंग का उपयोग न करें। आलसी लोडिंग हमेशा तुल्यकालिक होती है, इसलिए अतिरिक्त डेटा के लिए शामिल या अलग प्रश्नों का उपयोग करना कहीं बेहतर है।
स्टीफन क्लीयर

1
क्या कोई विशिष्ट कारण है कि आपको प्रति async क्वेरी के संदर्भ की आवश्यकता है? मुझे लगता है कि यह काफी सीमित कारक बन जाता है।
जैपनीगोलिका

1
@Zapnologica: यह उसी तरह है जैसे ES6 डिजाइन किया गया था। प्रत्येक संदर्भ एक समय में केवल एक क्वेरी को संभाल सकता है । इसलिए यदि आप अगले एक को शुरू करने से पहले एक प्रश्न पूरा करते हैं, तो आपको केवल एक संदर्भ की आवश्यकता होगी। यदि आप एक ही समय में कई क्वेरी करना चाहते हैं तो यह केवल एक समस्या है।
स्टीफन क्लीरी

@StephenCleary, मुझे उस क्वेरी को ढूंढने में एक कठिन समय हो रहा है क्योंकि अपवाद के तुरंत पहले मेरे पास कुछ भी नहीं है। क्या हमारे लिए कोई रास्ता है जो वर्तमान में निष्पादित हो रहा है? धन्यवाद
फैबियो Milheiro

4

यदि आप अपने डेटा प्रदाता इंजेक्शन के लिए IoC कंटेनर का उपयोग कर रहे हैं, तो अपने जीवनचक्र के लिए "क्षणिक" या "PerWebRequest" प्रकार का उपयोग करने पर विचार करें।

उदाहरण के लिए: https://github.com/castleproject/Windsor/blob/master/docs/lifestyles.md


3

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

दो ऑब्जेक्ट्स के बीच संबंध को परिभाषित नहीं किया जा सकता है क्योंकि वे अलग-अलग ऑब्जेक्ट ऑब्जेक्ट्स से जुड़े होते हैं।

इसका उपयोग करके हल किया जा सकता है PerRequestLifetimeManager। अधिक जानकारी यहाँ:

C # EF6 यूनिटी - Asp.Net वेब एपि का उपयोग कर एक संदर्भ में कई एसिंक्स कॉल करें

container.RegisterType<DbContext>(new PerRequestLifetimeManager());
container.RegisterType<ISupplierRepository, SupplierRepository>();
container.RegisterType<IContactRepository, ContactRepository>();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.