2012-01-31 10 views
7

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

तो मूल रूप से इसका मतलब है कि मेरी इकाइयां डिस्कनेक्ट मोड में खपत की जाती हैं। इन इकाइयों को बनाया, देखा, अद्यतन और हटाया जा सकता है। डिस्कनेक्ट मोड का उपयोग कर डेटाबेस में परिवर्तनों को वापस सहेजने में मुझे कोई समस्या नहीं थी। लेकिन मुझे एक विशेष मामला मिला जहां SaveChanges() विधि के कॉल पर कोई त्रुटि दिखाई देने के साथ परिवर्तन सहेजे नहीं गए हैं। ऐसा तब होता है जब मैं एक ऐसी इकाई को अद्यतन करने का प्रयास करता हूं जिसमें संग्रह संपत्ति हो। इकाई की स्केलर संपत्ति बिना किसी समस्या के बने रहती है लेकिन संग्रह पर परिवर्तन डेटाबेस पर प्रतिबिंबित नहीं होते हैं, जैसे कि अगर यह पुन: कनेक्शन पर इन परिवर्तनों को ट्रैक करने में सक्षम नहीं था।

यहां मेरे मामले का एक नमूना कोड है जहां मैं इकाई का नाम बदलता हूं और फिर ऑब्जेक्ट को अपने रिपोर्ट संग्रह में जोड़ता हूं। SaveChanges() के बाद, केवल ग्राहक नाम डेटाबेस पर प्रतिबिंबित किया गया है।

this.Client.Name = "Test Client"; 
this.Client.Reports.Add(new Report { Name = "Test Report" }); 

using (ReportCompositionEntities entities = new ReportCompositionEntities(this.connectionStringName)) 
{ 
    entities.Clients.ApplyCurrentValues(this.Client); 
    entities.SaveChanges(); 
} 

तो क्या मैं कुछ गलत कर रहा हूं या ईएफ किसी इकाई को दोबारा जोड़ने पर इस प्रकार के परिवर्तनों को ट्रैक करने में सक्षम नहीं है?

उत्तर

8

यह exactly what happens है। कोई परिवर्तन ट्रैकिंग नहीं है और ईएफ नेविगेशन संपत्ति में किए गए परिवर्तनों के बारे में नहीं पता है। ApplyCurrentValues केवल स्केलर और जटिल गुणों को संसाधित करने में सक्षम है। नेविगेशन गुण नहीं।

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

बीटीडब्ल्यू। मैंने एमवीवीएम का कभी भी उपयोग नहीं किया है, इसलिए मुझे यकीन नहीं है कि यह इस मामले में कैसे लागू होता है लेकिन एमवीपी के मामले में यदि आप एकल ऑपरेशन के लिए उपयोग किया जाता है तो आप लंबे जीवन संदर्भ का उपयोग कर सकते हैं - उदाहरण के लिए संपादन दृश्य अपने स्वयं के प्रस्तुतकर्ता के साथ अपने स्वयं के संदर्भ से संभाला जाएगा । यह संदर्भ तब तक लाइव रहेगा जब दृश्य एकल इकाई/समेकित = संपादित करने के लिए उपयोग किया जाएगा = इसका उपयोग इकाई को लोड करने के लिए किया जाएगा और उसी संदर्भ को इकाई को सहेजने के लिए उपयोग किया जाएगा क्योंकि इस मामले में संपादन उसी निष्पादन संदर्भ द्वारा किया जाता है और संबंधित है काम की एक इकाई।

+0

वास्तव में दिलचस्प मामला। अब तथ्य यह है कि ईएफ अद्यतन नहीं करता है इन परिवर्तनों को समझ में आता है क्योंकि नेविगेशन संपत्ति की इकाई को किसी अन्य इकाई द्वारा भी संदर्भित किया जा सकता है। कोई समस्या नहीं जब कोई नई इकाई बनाई जाती है लेकिन समेकन के मुद्दों को हटाने के साथ हो सकता है। मेरे आर्किटेक्चर में, प्रत्येक एमवीवीएम सीआरयूडी प्रतिमान की एक प्रतिस्थापन के रूप में। मैंने अपने वीएम को जुड़े मोड में ले जाया (डिस्पोजेक्शन प्रक्रिया को मेरे आर्किटेक्चर द्वारा बॉक्स से बाहर रखा गया है) और मेमोरी प्रोफाइलिंग ने अभी तक कोई समस्या नहीं जाहिर की है। समय बताएगा और डिस्कनेक्ट मोड पर वापस जाना वास्तव में काफी आसान है। आपकी सहायता के लिए धन्यवाद. – Ucodia

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