2010-02-19 21 views
6

मेरे पास एक तरीका है जो मेरे linq डेटा संदर्भ को सेट करता है। डीसी लौटने से पहले यह एक संग्रहित प्रो को कॉल करता है जो वर्तमान उपयोगकर्ता की पहचान करने के लिए CONTEXT_INFO मान सेट करता है।मेरा CONTEXT_INFO() खाली क्यों है?

एक ट्रिगर किसी भी बदलाव को उठाता है और इस संदर्भ डेटा का उपयोग करके एक ऑडिट रिकॉर्ड लिखता है।

मैंने देखा कि मेरा संदर्भ डेटा ऑडिट तालिका में खाली था इसलिए मैंने इस प्रक्रिया के माध्यम से कदम उठाने के लिए एक साधारण इकाई परीक्षण लिखा और मुझे अभी भी कुछ भी नहीं मिला। हालांकि अगर मैं सभी लिंक-टू-एसक्यूएल कथन को एक क्वेरी विंडो में पेस्ट करता हूं तो संदर्भ डेटा वहां होता है।

एक प्रोफाइलर ट्रेस को देखते हुए यह इस प्रक्रिया में कुछ sp_reset_connection कॉल करता है। मुझे समझ में आया था कि इन्हें CONTEXT_INFO मान पर कोई प्रभाव नहीं होना चाहिए।

तो यहां क्या हो रहा है?

उत्तर

8

एक LINQ DataContext SQL करने के लिए वास्तव में कनेक्शन खुला नहीं रखता है जब आप प्रश्नों पर अमल, या तो क्वेरी समझ या ExecuteQuery/ExecuteMethod कॉल का उपयोग कर, और CONTEXT_INFO केवल एक ही कनेक्शन के संदर्भ में रहती है।

इसे काम करने के लिए, आपको context_info सेट करने से पहले context.Connection.Open() का उपयोग करके DataContext पर मैन्युअल रूप से कनेक्शन खोलने की आवश्यकता है। एक बार कनेक्शन पहले से ही खुला हो जाने पर, लगातार पूछे जाने वाले प्रश्न कनेक्शन समाप्त होने पर कनेक्शन को स्वतः बंद नहीं करेंगे।

नोट - इस के लिए तकनीकी कारण यह है कि यह IDbCommandCommandBehavior.CloseConnection साथ सेट पर ExecuteReader invokes, जब तक कनेक्शन पहले से ही खुला था। यदि आप उसी ध्वज सेट वाले SqlCommand/IDbCommand ऑब्जेक्ट्स का उपयोग करते हैं तो आप वही व्यवहार स्वयं देख सकते हैं।

संपादित करें - मुझे लगता है कि मुझे यह भी इंगित करना चाहिए कि कनेक्शन को पूल किया गया है, तकनीकी रूप से भौतिक कनेक्शन पूरे समय "खुला" है, लेकिन IDbConnection अभी भी बंद हो रहा है, जो कनेक्शन रीसेट करता है।

+0

यही कारण है कि मुझे स्टैक ओवरफ़्लो पसंद है। आपने मुझे एक दुखी सप्ताहांत से बचने में मदद की है। धन्यवाद, मैं इसे देख लूंगा। –

3

sp_reset_connection context_info को रीसेट करता है। sp_reset_connection क्लाइंट ऐप पूल द्वारा कनेक्शन को रीसाइक्लिंग करते समय कहा जाता है, इसलिए ऐसा लगता है कि आप एक कनेक्शन पर संदर्भ को सीट कर रहे हैं, कनेक्शन बंद कर रहे हैं और संदर्भ को नए कनेक्शन पर सेट करने की उम्मीद कर रहे हैं, whcih स्पष्ट रूप से गलत है।

+0

यह सब इतना समझ में आता है कि अब आप इसे इस तरह रखते हैं, धन्यवाद –

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