2015-10-20 7 views
8

बिना किसी मुद्दे के हमारे अनुप्रयोगों में एंटीटी फ्रेमवर्क का उपयोग करने के कुछ सालों बाद, हमारी कंपनी ने हमारे उपयोगकर्ताओं को लैपटॉप तैनात करना शुरू कर दिया है। हमारे नेटवर्क पर सीधे, वायर्ड कनेक्शन के साथ, लैपटॉप का उपयोग साइट पर किया जा रहा है।संदर्भ के निपटारे के बिना मैं एक इकाई फ्रेमवर्क कनेक्शन को रीफ्रेश कैसे कर सकता हूं

तब से, हम अपने कार्यक्रमों के भीतर दुर्घटनाओं की एक बड़ी वृद्धि देखी है, अपवाद लॉग

दिखा साथ
System.Data.SqlClient.SqlException: A transport-level error has occurred when receiving results from the server. 
(provider: Session Provider, error: 19 - Physical connection is not usable) 

मेरे सिद्धांत यह है कि इस मुद्दे को तथ्य यह है कि लैपटॉप, पीसी के विपरीत, जाना की वजह से उपजी है सोने के लिए। मुझे लगता है कि जब लैपटॉप सो जाता है तो नेटवर्क एडाप्टर अक्षम किया जा रहा है, और बैक अप उठाने पर फिर से सक्षम किया जाता है। मुझे लगता है कि हमारे कार्यक्रम अभी भी एक कनेक्शन का उपयोग कर सर्वर के साथ संवाद करने की कोशिश कर रहे हैं जो अब नहीं है।

Microsoft.Win32.SystemEvents.PowerModeChanged 

मैं पता लगा सकते हैं जब यह उठता है और कनेक्शन को ताज़ा:

तो, मेरा विचार पर प्रतिक्रिया के लिए किया गया था। मुसीबत यह है कि ऐसा करने का एकमात्र तरीका यह है कि वर्तमान डीबीकॉन्टेक्स्ट का निपटान करना और एक नया चालू करना है।

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

एक दूसरा विचार जो मैंने किया था वह एक डीबीकॉन्टेक्स्ट क्लोन करने के लिए एक विधि बनाना था। जब कंप्यूटर उठता है, तो मैं एक नया डीबीकॉन्टेक्स्ट बना सकता हूं और इसे निपटाने से पहले राज्य को पुराने से कॉपी कर सकता हूं ... लेकिन हमारे कुछ डेटा मॉडल बड़े पैमाने पर हैं, और प्रत्येक के लिए एक गहरी क्लोन विधि बनाना काफी उपक्रम होगा।

यह मेरे लिए होता है कि यह अभी भी हमें जिस तरह से जाना है ... लेकिन मैं यह जांचने के लिए मूर्ख नहीं हूं कि कोई भी इकाई फ्रेमवर्क डीबीकॉन्टेक्स्ट के कनेक्शन को रीफ्रेश करने के तरीके को जानता है, इसके बिना इसे खोए राज्य।

मैं किसी भी सलाह के बारे में किसी भी सलाह की सराहना करता हूं।

+2

सुनिश्चित नहीं है कि आपके पास किस प्रकार का डिज़ाइन है लेकिन स्मृति में बड़ी सहेजी गई जानकारी रखना एक अच्छा विचार नहीं है। आपको किसी भी समय समय-समय पर जानकारी को स्वतः सेव करना चाहिए। कम से कम उस हानि की जानकारी के साथ यदि कोई भी यथासंभव कम से कम किया जाएगा। कई एप्लिकेशन (वेब ​​ऐप्स सहित) इस रणनीति का उपयोग करते हैं। –

+0

यह एक उचित बिंदु है। हम ऑटो-सेव क्यों नहीं करते हैं क्योंकि हम उपयोगकर्ताओं को यह तय करने की अनुमति देते हैं कि परिवर्तनों को सहेजना या रद्द करना है या नहीं। ऐसा करने के लिए, दो रणनीतियों हैं: 1) संपादन शुरू होने पर स्मृति में मूल डेटा की एक प्रति बनाएं, डाटाबेस में लाइव अपडेट बनाए रखें क्योंकि डेटा बदल गया है, पुरानी प्रतिलिपि के साथ डेटा अपडेट करना रद्द करें। 2) एक कार्यशील प्रतिलिपि को स्मृति में रखें, और जब उपयोगकर्ता अपने परिवर्तनों को सहेजने का विकल्प चुनता है तो केवल डेटाबेस पर बने रहें। कार्यान्वयन परिप्रेक्ष्य से, दूसरा विकल्प सरल है, और वह तरीका है जिसका हम उपयोग करते हैं। उस ने कहा, यह ऊपर देखे गए मुद्दों की तरह मुद्दों का कारण बनता है। – Chronicide

+0

क्या कोई घटना उपलब्ध नहीं है जो लैपटॉप सोने से पहले होती है? आप पहले से बचा सकते हैं, कनेक्शन बंद कर सकते हैं और जब यह जागता है तो इसे फिर से खोलें। – Matt

उत्तर

0

मैं अभी टिप्पणी करने जा रहा था लेकिन मेरे पास ऐसा करने के लिए पर्याप्त प्रतिष्ठा अंक नहीं हैं, इसलिए मैं सोच रहा था कि क्या डिस्कनेक्ट किए गए राज्य में एंटिटी फ्रेमवर्क के साथ काम करना संभव नहीं है? हो सकता है कि कड़ी में लेख के नीचे मदद कर सकते हैं:

https://msdn.microsoft.com/en-us/data/jj592676.aspx

+0

संदर्भ के लिए धन्यवाद। दुर्भाग्यवश, यह एक मृत कनेक्शन का उपयोग करके संवाद करने की कोशिश कर रहे इकाई फ्रेमवर्क के मुद्दे को हल नहीं करता है। उस ने कहा, यह एक स्पष्ट लेख है कि संस्थाओं को किसी संदर्भ में कैसे संलग्न किया जाए, जो मुझे बहुत उपयोगी हो सकता है, मुझे क्लोन विधि बनाना होगा ... नई प्रविष्टियां बनाने के बजाय, मैं मौजूदा प्रविष्टियों को जोड़ सकता हूं जो चिह्नित किए गए हैं या मेरे पुराने संदर्भ से संशोधित। यह थोड़ा प्रयोग करेगा, लेकिन यह अभी भी एक बहुत अच्छा संसाधन है। धन्यवाद। – Chronicide

3

मैं सुनिश्चित नहीं हूं, चाहे वह अपने विशिष्ट मामले में मदद मिलेगी, लेकिन आप अपने DbConetxt वर्ग द्वारा प्रयोग किया जाता कनेक्शन की स्थिति की जांच कर सकते हैं और अंत में इसे दोबारा खोलो

if(context.Database.Connection.State == ConnectionState.Closed) { 
    context.Database.Connection.Open(); 
} 

यह यह भी संभव है कि यह के निर्माता में DbContext से कनेक्शन गुजरती हैं और मैन्युअल रूप से इस संबंध प्रबंधन करने के लिए।

var conn = new SqlConnection("{connectionString}")); 
var context = new DbContext(conn, contextOwnsConnection: false); 

... 

if(conn.State == ConnectionState.Closed) { 
    conn.Open(); 
} 
context.SaveChanges(); 

... 

context.Dispose(); 
conn.Dispose(); 

वहाँ कुछ सीमाएं हैं आप एफई 5 या इससे पहले versios में इस कोड का उपयोग करना चाहते हैं। official documentation.

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