2010-10-11 11 views
6

मेरा प्रोजेक्ट (UI परत asp.mvc) .NET 3.5 का उपयोग करके विकसित किया गया था। नेट 4.0 पर अपग्रेड करने के बाद मैं संकलित प्रश्नों के साथ समस्या यह मिल गया है:डेटाकॉन्टेक्स्ट संकलित क्वेरी समस्या .NET 4

[ArgumentException: Query was compiled for a different mapping source than the one associated with the specified DataContext.] 
    System.Data.Linq.CompiledQuery.ExecuteQuery(DataContext context, Object[] args) +863348 
    System.Data.Linq.CompiledQuery.Invoke(TArg0 arg0, TArg1 arg1) +110 

हर बार जब मैं अपने क्वेरी चलाने मैं अपने संदर्भ

return StaticQueries.getTopFiveOrders(mContext, int howMany); 


public static Func<Mycontext, int, IQueryable<Order>> getTopFiveOrders 
      = CompiledQuery.Compile 
       ((Mycontext mContext, int howMany) => 
       (some query).Distinct()); 

दूसरा अनुरोध पर त्रुटि होती गुजर रहा हूँ।

उत्तर

4

यह संकलित क्वेरी के तरीके के तरीके में बदलाव के कारण है।

अब उन्हें हमेशा एक ही संदर्भ का उपयोग करके चलाने की आवश्यकता है।

This Microsoft connect page बताता है कि क्यों बदलाव किया गया था:

इस मामले में समस्या तथ्य यह है कि एक ही CompiledQuery मानचित्रण स्रोत सब फांसी के लिए इस्तेमाल किए जाने की आवश्यकता के कारण होता है। कोड उदाहरण में आप समस्या को दोबारा उत्पन्न करने के लिए उपयोग कर रहे हैं, डेटाकॉन्टेक्स्ट के विभिन्न उदाहरण हर बार एक नए मैपिंग स्रोत का उपयोग करते हुए, लेकिन क्वेरी इसकी रिपोर्ट करने में विफल रहता है, और बस चुपचाप विफल रहता है। यदि आप DataContext.Log प्रॉपर्टी या अन्य लॉगिंग जैसे SQL सर्वर प्रोफाइलर का उपयोग करते हैं, तो आप देखेंगे कि दूसरा अद्यतन सर्वर पर भी नहीं भेजा जा रहा है।

यह .NET Framework 4.0 में तय किया गया है ताकि एक अपवाद की सूचना दी जा सके जिसमें "निर्दिष्ट डेटाकॉन्टेक्स्ट से जुड़े एक से अलग मैपिंग स्रोत के लिए क्वेरी को संकलित किया गया था" जैसे संदेश शामिल होंगे, और यह नहीं होगा बस चुपचाप असफल हो जाओ। हालांकि, आपके द्वारा प्रदान किया गया कोड जो काम कर रहा है वह ऐसा करने का सही तरीका है, क्योंकि यह LinqTestDataContext के सभी उदाहरणों के लिए एक ही स्थिर मैपिंग स्रोत का उपयोग करता है।

मूल रूप से यह हमेशा एक समस्या थी, लेकिन चुपचाप विफल करते थे, वे सिर्फ विफलता नेट 4.

0

मैं भी इसी तरह की समस्या का सामना में स्पष्ट किया। मैंने संकलित प्रश्नों से स्थैतिक को हटा दिया, यह ठीक काम करता है। हालांकि मुझे अभी तक यह पता लगाना नहीं है कि यह प्रदर्शन पर कितना अंतर बनाता है।

1

मैंने इस पर ध्यान देने में काफी समय बिताया और .NET 4.0 में व्यवहार कैसे बदला गया। मैं अपने निष्कर्ष अपने ब्लॉग यहाँ में अधिक अच्छी तरह से विस्तृत है:

http://www.roushtech.net/2014/01/19/statically-compiled-linq-queries-broken-in-net-4-0/

इसके बारे में किसी न किसी तरह है: (अलग मैपिंग के बीच एक संकलित क्वेरी पुन: उपयोग) माइक्रोसॉफ्ट कुछ गूंगा करने से लोगों की रक्षा करने के लिए एक परिवर्तन किया है, लेकिन ऐसा लगता है कि एक प्रमुख प्रदर्शन लाभ टूट गया है (उसी मैपिंग के विभिन्न संदर्भों के बीच एक संकलित क्वेरी का पुन: उपयोग करना, लेकिन मैपिंग के विभिन्न उदाहरण)।

गेटर्स का उपयोग करना, या आपके क्लास के सदस्य जो संकलित हो, का परिणाम केवल निरंतर पुन: संकलन होगा, और कोई वास्तविक प्रदर्शन लाभ नहीं होगा।