2012-09-03 17 views
9

में किए गए लोड लोड में मेरे पास एक WPF ऐप है जिसमें डेटा की एक सूची है जिसमें मैंने ईएफ के साथ लोड किया है। कुछ अन्य विंडो ग्रिड पर लोड किए गए उसी डेटा में परिवर्तन कर सकती हैं लेकिन एक अलग dbcontext उदाहरण का उपयोग कर सकती हैं। मैं ग्रिड पर परिवर्तित डेटा कैसे देख सकता हूं? मुझे पता है कि मैं ctx.Entry<MyEntity>(instance).Reload(); के साथ एक इकाई को रीफ्रेश कर सकता हूं - लेकिन मैं सभी बदलाव देखना चाहता हूं और इससे कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, मुझे केवल पुराने मान दिखाई देते हैं। मैं AsNoTracking का उपयोग नहीं कर सकता हूं और न ही इस मामले में नया DbContext उदाहरण बना सकता हूं।किसी अन्य डीबीकॉन्टेक्स्ट

+0

आप 'AsNoTracking' का उपयोग क्यों नहीं कर सकते? –

+0

क्योंकि उपयोगकर्ता सीधे ग्रिड में परिवर्तन कर सकता है और इसे सहेज सकता है। – user1526627

+0

लेकिन ऐसे मामले में आप सहेजे गए डेटा को संपादित नहीं कर सकते हैं और रीलोड इन आंकड़ों को अलग कर सकता है? आप इस तरह के मुद्दे को कैसे हल करना चाहते हैं? –

उत्तर

13

मेरे लिए एक बहुत ही साधारण मामला जैसा दिखता है और मैं नहीं देख सकता कि ईएफ केवल इकाइयों के मूल्यों को अपडेट क्यों नहीं करता है।

ईएफ में यह तंत्र भी है लेकिन यह डीबीकॉन्टेक्स्ट एपीआई पर खुलासा नहीं है। आपको ऑब्जेक्ट कॉन्टेक्स्ट पर वापस जाने की आवश्यकता है। तुम सिर्फ संस्थाओं के सेट फिर से लोड करने चाहते हैं तो आप कहेंगे:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
objectContext.Refresh(RefreshMode.StoreWins, listOfEntitiesToReload); 

RefreshMode.StoreWins का कारण बनता है सभी लंबित परिवर्तन पुनः लोड मूल्यों द्वारा ओवरराइट किया जाना है। आप RefreshMode.ClientWins का भी उपयोग कर सकते हैं जो आपके परिवर्तनों को बनाए रखेगा और उन्हें पुनः लोड किए गए डेटा के साथ विलय करेगा। इस दृष्टिकोण के साथ समस्या यह है कि यह केवल आपके पास पहले से मौजूद इकाइयों को पुनः लोड करता है। आपको नई संस्थाएं नहीं मिलेंगी।

आप नए संस्थाओं पाने के लिए और साथ ही आप किसी क्वेरी को निष्पादित करना होगा और आप एफई कि आप मूल्यों को फिर से लोड करना चाहते हैं बताना होगा चाहते हैं:

var objectContext = ((IObjectContextAdapter)dbContext).ObjectContext; 
var objectSet = objectContext.CreateObjectSet<MyEntity>(); 
objectSet.MergeOption = MergeOption.OverwriteChanges; 
var result = objectSet.Where(...).ToList(); 
फिर

MergeOption.OverwriteChanges सभी लंबित परिवर्तन अधिलेखित कर देता है, लेकिन आप MergeOption.PreserveChanges का उपयोग विलय करने के लिए कर सकते हैं आपके संपादित मूल्यों में पुनः लोड किए गए मान।

मुझे लगता है कि कुछ संबंधों के साथ ताज़ा मूल्यों के साथ कुछ समस्याएं हो सकती हैं और शायद उन संस्थाओं को भी जो डेटाबेस में हटा दिए गए थे।

+0

यह वही है जो मुझे चाहिए, धन्यवाद, ईएफ पर मेरा विश्वास बहाल किया गया है :) – user1526627

+0

@ ladislav-mrnka एक प्रश्न, क्या यह आखिरी कदम वास्तव में आवश्यक है? अगर मैं आपको सही ढंग से समझता हूं, तो ईएफ केवल रिकॉर्ड्स में बदलावों को पहचान लेगा जो इसे पहले ही लोड कर चुके हैं और उन्हें पहले तरीके से मर्ज कर चुके हैं। तो यदि आप मैन्युअल रूप से किसी तालिका में कोई नई पंक्ति जोड़ना चाहते हैं तो इसे पहले तरीके से dbcontext में अपडेट नहीं किया जाएगा? मैंने अभी कोशिश की और मुझे दूसरी तरफ कोई ज़रूरत नहीं थी। शायद व्यवहार बदल गया है या मैं पूरी तरह से आपको गलत समझा? :) – DrCopyPaste

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