2013-03-22 5 views
6

पर मैं पुनः लोड फ़ंक्शन के साथ कुछ परिवर्तनों को त्यागने का प्रयास करता हूं। मुझे InvalidOperationException मिलता है। मैं इसे कैसे रोक सकता हूं?इकाई फ्रेमवर्क 5 अमान्यऑपरेशन अपवाद

DbContext.SaveChanges(); 
//Entity is in Unchanged state 
//Make some changes to an entity 
//Change state to modified 
DbContext.Entry(entity).Reload(); 

InvalidOperationException
EntityMemberChanged या EntityComplexMemberChanged पहले पर एक ही संपत्ति के नाम के साथ ही परिवर्तन पर नजर EntityMemberChanging या EntityComplexMemberChanging बुला बिना बुलाया गया था। उचित रूप से रिपोर्टिंग परिवर्तनों के बारे में जानकारी के लिए, इकाई फ्रेमवर्क दस्तावेज़ देखें।

संपादित करें:
मैं सक्षम है और विकलांग ProxyCreationEnabled, LazyLoadingEnabled गए हैं।
विभिन्न दृष्टिकोणों का भी प्रयास किया। इन सभी प्रयासों ने एक ही अपवाद फेंक दिया।

var objContext = ((IObjectContextAdapter)context).ObjectContext; 
objContext.Refresh(RefreshMode.ClientWins, entry.Entity); 


entry.OriginalValues.SetValues(entry.GetDatabaseValues()); 

आशा है कि मैं एक समाधान मिलता है। सभी डेटा को पुनः लोड करने के लिए पूर्ण DbContext को निपटाना नहीं चाहते हैं।

+1

इनमें से कोई भी मदद करेगा? http://stackoverflow.com/questions/5221314/refresh-entity-instance-with-dbcontext या यह http://stackoverflow.com/questions/5799737/entity-framework-4-1-dbset-reload या यह http: //connect.microsoft.com/VisualStudio/feedback/details/694567/entitymemberchanged-or-entitycomplexmemberchanged-was-called-without-first-calling-entitymemberchanging-or-entitycomplexmemberchanging-on-the-same-change-tracker-with- वही संपत्ति-नाम ?? – LiverpoolsNumber9

+0

इसमें आपकी स्थिति से कोई लेना-देना नहीं हो सकता है, लेकिन जांचना चाहता था .. क्या आप अपने प्रोग्राम में किसी भी प्रकार का मल्टीथ्रेडिंग/एसिंक कर रहे हैं? किसी भी PLINQ या 4.5 async/प्रतीक्षा का उपयोग करने की तरह? – tostringtheory

+0

@tostringtheory पहले से ही किसी भी थ्रेडिंग के बिना इसे चेक किया गया है। एक ही समस्या है। –

उत्तर

2

this MSDN thread/post

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

पीएस टिप्पणी के लिए बहुत लंबा है।

+0

ठीक है धन्यवाद। मैंने एक और कामकाज किया है। –

0

यदि कोड आपके द्वारा पोस्ट किया गया है, जहां ऑब्जेक्ट को डीबीकॉन्टेक्स्ट से लोड किया गया है, तो उसी डीबीकॉन्टेक्स्ट से पुनः लोड किया गया है, तो आपको इसे संशोधित रूप से संशोधित नहीं किया जाना चाहिए; इकाई में परिवर्तन करना पहले से ही संशोधित के रूप में चिह्नित करने के लिए पर्याप्त है। दूसरे शब्दों में:

var o = new SimpleObject { Stuff = "One" }; 
db.SimpleObjects.Add(o); 
db.SaveChanges(); 

o.Stuff = "Two"; // implicitly marks as Modified for you, since it's still Attached 

// Unnecessary 
//db.Entry(o).State = System.Data.EntityState.Modified; 

db.Entry(o).Reload(); // Works for me 
0

मैंने पाया कि पुनः लोड प्रॉक्सी इकाइयों पर विफल रहता है जिनमें नेविगेशन गुण हैं।

के चारों ओर एक काम के रूप में, वर्तमान मान रीसेट और फिर इस तरह फिर से लोड:

var entry = DbContext.Entry(entity); 
entry.CurrentValues.SetValues(entry.OriginalValues); 
entry.Reload(); 
0

मैं एक ऐसी ही स्थिति थी, एक ही अपवाद विवरण के साथ। मेरे मामले में मैं संदर्भ से एक इकाई को हटाने की कोशिश कर रहा था, और यह किसी भी तरह से एक संरक्षित हैंडलर से अभी भी बुलाया जा रहा था।

मैं बस के साथ

MyEntity.PropertyChanged -= MyPropertyChangedHandler; 
context.MySet.Remove(MyEntity); //it works after removing the handler 

आशा इस कोई मदद करता है संदर्भ से इकाई को हटाने से पहले हैंडलर हटा दिया।

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