2013-12-18 1 views

उत्तर

9

क्या इस खराब प्रलेखित त्रुटि कहने की कोशिश कर रहा है कि आप गलती से जिसमें ट्रैकिंग परिवर्तनअधिक परिवर्तन का कारण बनता है एक प्रणाली की स्थापना है।

जब इकाई फ्रेमवर्क ने आपकी इकाइयों में से एक पर संपत्ति बदल दी, जैसे कि पहचान आईडी अपडेट के साथ SaveChanges के दौरान, आपने कोड चलाया जो अन्य ट्रैक किए गए गुण को बदल दिया।

उदाहरण के लिए, संपत्ति है कि इकाई की रूपरेखा की स्थापना की गई थी एक घटना है, शायद INotifyPropertyChanged,, जिसका ListChanged ईवेंट हैंडलर यूआई में था जो शायद एक BindingSource या कुछ बाध्यकारी सूची द्वारा सब्सक्राइब किया गया था शुरू हो रहा है और कुछ अन्य संपत्ति का एक गणना शुरू हो रहा , और परिवर्तन ट्रैकर दूसरे संपत्ति परिवर्तन का पता चला।

सरल निदान SaveChanges() कॉल पर ब्रेकपॉइंट और SaveChanges कॉल() के तुरंत बाद रखना है। जब पहला ब्रेकपॉइंट मारा जाता है, तो प्रत्येक इवेंट हैंडलर पर ब्रेकपॉइंट रखें जो संभवतः ट्रिगर हो सकता है। (BindingSources एक-दूसरे की घटनाओं को गुणा करने के लिए कुख्यात हैं।) डीबगिंग जारी रखें। यदि SaveChanges के तुरंत बाद बिंदु के अलावा कोई ब्रेकपॉइंट मारा जाता है, तो आप जानते हैं कि समस्या कहां है।

सरल समाधान सहेजेंChanges कॉल के प्रत्येक पक्ष पर IsSaving जैसे ध्वज सेट करना है। फिर प्रत्येक गलत व्यवहार घटना हैंडलर में, एक सरल जांच करें और डीबीसीएन्टेक्स्ट बचत की प्रक्रिया में है, तो किसी भी संस्था को संशोधित न करें।

IsSaving = true; 
try 
{ 
    await db.SaveChangesAsync() 
} 
finally 
{ 
    IsSaving = false; 
} 

(एक अन्य संभावना है कि आप एक से अधिक थ्रेड — से इकाई को बदलने गया है कभी नहीं कई में परिवर्तन पर नजर शामिल: सुनिश्चित करें कि आप मामले SaveChanges में finally का उपयोग करते हैं एक अपवाद है कि आप एक उच्च स्तर पर पकड़ फेंकता धागे!)

+0

सुंदर स्पष्टीकरण, बहुत बहुत धन्यवाद! – Dan

+0

दोनों प्रश्न और इस तरह के विस्तृत उत्तर पोस्ट करने के लिए धन्यवाद! – Hannish

1

मेरे पास एक ही समस्या थी। मैंने INotifyPropertyChanged ईवेंट से वायर्ड किया था जिसने SaveChanges() कॉल के दौरान किसी संपत्ति को बदलने की संभावना बनाई थी। मुझे लगता है कि dbContext.SaveChanges(), निकालें() निष्पादित करते समय आपके द्वारा ट्रैक की गई इकाइयों के ईवेंट हैंडलर को अनदेखा करना बेहतर तरीका है।

+0

अनवरत अक्सर सबसे सुरक्षित और हल्का विकल्प होगा। हालांकि, हमारे लिए एक ऐसा मामला है जहां परिवर्तन के बारे में सूचित किया जाना महत्वपूर्ण है, भले ही हम उस समय के दौरान इकाई फ्रेमवर्क-दृश्य गुणों को सेट नहीं कर रहे हों। – jnm2

2

मैं इस त्रुटि के साथ अपने अनुभव की व्याख्या करूंगा, उम्मीद करता हूं कि यह किसी की मदद कर सकता है। और सुंदर स्पष्टीकरण के लिए jnm2 के लिए धन्यवाद।

मैं चालान और रसीद संस्थाओं, और InvoiceViewModel था। Thie ViewModel चालान संपत्ति में सब्सक्राइब किया गया था, जिसके अंदर यह उठा रहा था CanExecuteChanged ईवेंट।

मैं नेविगेशन संपत्ति और कहा जाता SaveChanges() है, जो Invoice.ReceiptID संपत्ति बदल उठाया और ViewModel, जो बारी में CanExecuteChanged घटनाओं के सभी प्रकार उठाया पर OnPropertyChanged ईवेंट हैंडलर चालू होने वाले चालान करने के लिए रसीद गयी।

समस्या था कि कैन commandname में से एक निष्पादित तरीकों Context.ChangeTracker.HasChanges() जो अंततः एक अपवाद फेंक दिया बुला रहा था।

मैंने इसे कैसे ठीक किया? मैंने jnm2 का पालन किया, मैंने आईएसविंग के साथ वीएम को ध्वजांकित किया और ऑनप्रॉपर्टी चेंज इवेंट हैंडलर के अंदर ध्वज के लिए चेक किया।

एक बार फिर, धन्यवाद jnm2, और उम्मीद है कि किसी को भी यह सहायक मिल जाएगा।

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