यह एक छोटा सा प्रयोग मैंने किया है:लिंक कैशिंग डेटा मान - प्रमुख समरूपता समस्या?
MyClass obj = dataContext.GetTable<MyClass>().Where(x => x.ID = 1).Single();
Console.WriteLine(obj.MyProperty); // output = "initial"
Console.WriteLine("Waiting..."); // put a breakpoint after this line
obj = null;
obj = dataContext.GetTable<MyClass>().Where(x => x.ID = 1).Single(); // same as before, but reloaded
Console.WriteLine(obj.MyProperty); // output still = "initial"
obj.MyOtherProperty = "foo";
dataContext.SubmitChanges(); // throws concurrency exception
जब मैं लाइन 3 के बाद ब्रेकप्वाइंट मारा, मैं एक SQL क्वेरी विंडो पर जाएं और मैन्युअल रूप से मान "अद्यतन" में बदलें। तब मैं दौड़ता रहता हूं। लिंक मेरी ऑब्जेक्ट को फिर से लोड नहीं करता है, लेकिन उसमें पहले से स्मृति का उपयोग करता है! डेटा समेकन के लिए यह विशाल समस्या है!
आप ऑब्जेक्ट्स के इस छिपे हुए कैश को कैसे अक्षम करते हैं जो लिंक्स स्पष्ट रूप से स्मृति में रख रहा है?
EDIT - प्रतिबिंब पर, यह केवल असंभव है कि माइक्रोसॉफ्ट लिंक फ्रेमवर्क में इतनी भारी चक्कर छोड़ सकता था। उपर्युक्त कोड जो मैं वास्तव में कर रहा हूं उसका एक संक्षिप्त संस्करण है, और वहां कुछ छोटी सूक्ष्मताएं हो सकती हैं जिन्हें मैंने याद किया है। संक्षेप में, अगर आप उपरोक्त मेरे निष्कर्ष सही हैं तो यह सत्यापित करने के लिए कि आप अपना स्वयं का प्रयोग करेंगे, मैं सराहना करता हूं। वैकल्पिक रूप से, कुछ प्रकार का "गुप्त स्विच" होना चाहिए जो समवर्ती डेटा अपडेट के खिलाफ लिंक मजबूत बनाता है। पर क्या?
+1 ओएमजी, यह वास्तव में एक गोटो है! उसे सी # गोटाचा केबी में जोड़ना होगा ... –
इससे भी बदतर, अगर आप वहां उसकी सलाह का पालन करते हैं और ऑब्जेक्टट्रैकिंग सक्षम = झूठा सेट करते हैं, तो आप केवल डीबी से पढ़ सकते हैं; आप सबमिट चेंज नहीं कर सकते! यह वास्तव में जीवन को मुश्किल बनाता है! –
यहां सी # गॉचा केबी का एक लिंक है: http://stackoverflow.com/questions/241134/what-is-the-worst-c-net-gotcha –