7

मैं अब अपने एएसपी.नेट एमवीसी एप्लिकेशन पर महीनों के लिए काम कर रहा हूं। जब मैंने पहली बार इस पर काम करना शुरू किया तो मैं एंटिटी फ्रेमवर्क 4.3 (कोड-फर्स्ट डब्ल्यू/माइग्रेशन) का उपयोग कर रहा था। जबकि मैं ऐसा कर रहा था, मैं अपनी मुख्य क्लाइंट टेबल पर अपडेट करने की कोशिश कर रही कुछ समस्याओं में भाग गया। मुख्य क्लाइंट में ग्राहक की सभी मूलभूत जानकारी होती है, और बीपी क्लाइंट टेबल के साथ 1: 1 संबंध होता है, जिसमें बीपी मॉड्यूल के लिए उनके लाइसेंस अनुबंध से संबंधित उस ग्राहक के बारे में अधिक विशिष्ट जानकारी होती है। दोनों टैब टैब नियंत्रण में उसी पृष्ठ पर संपादित किए जा सकते हैं। हालांकि, मैं निम्न अपवाद जब EntityState.Modified किया जा रहा करने के लिए MainClient वस्तु की EntityState बदलने का प्रयास कर रही पर रखा:इकाई फ्रेमवर्क 4.3 बनाम 5.0 मतभेद अपडेट करना

System.InvalidOperationException : An object with the same key already exists 
in the ObjectStateManager. The ObjectStateManager cannot track multiple objects 
with the same key. 

मैं जबकि डिबगिंग देखा है कि वस्तु ही जब यह मेरे नियंत्रक वर्ग में चला गया अलग माना जाता था बचाने होने के लिए। इस मुद्दे के लिए एक समाधान के रूप में, मैंने this blog post और this SO question में मिली समस्याओं के समान समाधान लागू किया। यहाँ कैसे फिर से संलग्न वस्तुओं के लिए कोड बाद में देखा (गन्दा, मुझे पता है), संपादित करें विधि client नामक एक MainClient वस्तु में पारित किया जा रहा दी है:

var newClientObject = new MainClient { ClientID = client.ClientID }; 
Db.MainClients.Attach(newClientObject); 
Db.Entry(newClientObject).CurrentValues.SetValues(client); 

var bpClient = new BPClient { ClientID = client.ClientID, BaseClient = newClientObject }; 
if (client.BPClient != null) 
{ 
    Db.BostonpostClients.Attach(bpClient); 
    Db.Entry(bpClient).CurrentValues.SetValues(client.BPClient); 
} 

Db.SaveChanges() 

यह सभी प्रकार के परीक्षण के माध्यम से ठीक और dandy काम किया। हाल ही में अब तक।

हाल ही में, मैंने एंटीटी फ्रेमवर्क 5 (अभी भी कोड-फर्स्ट का उपयोग करके) का उपयोग करने के लिए अपने एप्लिकेशन को अपग्रेड किया है। जब मैं मुख्य क्लाइंट संपादन पृष्ठ का फिर से परीक्षण कर रहा था, हालांकि, मुझे कुछ अनियमित व्यवहार मिला। कुछ फ़ील्ड, संपादित किए जाने पर, समस्याओं के बिना सहेजे जाएंगे। अन्य डीबी के लिए कभी प्रतिबद्ध नहीं होंगे। फिर भी दूसरों को ठीक रहेगा, लेकिन केवल तभी जब वे ऑब्जेक्ट का संपादन करने का एकमात्र हिस्सा थे। मैंने कंट्रोलर क्लास में डीबीकॉन्टेक्स्ट से बाहर निकल लिया, और पाया, बल्कि कष्टप्रद, कि न केवल कंट्रोलर क्लास को भेजे गए पेज पर किए गए बदलाव थे, लेकिन ऑब्जेक्टस्टेट मैनेजर में मुख्य क्लाइंट और बीपी क्लाइंट ऑब्जेक्ट्स दोनों थे यह पृष्ठ पर किए गए परिवर्तनों के साथ भी! मुझे यहां उल्लेख करना चाहिए, कि मुझे डिबगिंग करते समय एक त्रुटि नहीं मिली, SaveChanges() के बाद भी नहीं।

मैं कोशिश करते हैं और क्या यह मूल रूप से किया गया था करने के लिए कोड वापस लौटने का फैसला किया, कि यह ऐसा करने का तार्किक ढंग से कहने के लिए है:

Db.Entry<BPClient>(client.BPClient).State = EntityState.Modified; 
Db.Entry<MainClient>(client).State = EntityState.Modified; 

Db.SaveChanges(); 

और अब यह पूरी तरह से ठीक काम करता है। कोई अवैधऑपरेशन अपवाद नहीं। तो यह ठीक ठीक हो गया है।

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

क्या कोई जानता है कि ऐसा क्यों हुआ होगा?

+0

यह आपकी मदद कर सकता है। ईटी 4.3 से एंटीटी फ्रेमवर्क 5 एनम्स और मूविंग सॉल्यूशन http://thedatafarm.com/blog/data-access/video-entity-framework-5-enums-and-moving-solution-from-ef-4-3/ – Aru

उत्तर

0

मुझे यह समस्या स्वयं थी। मैं डेटाबेस टेबल को पॉप्युलेट करने के लिए आईडीबीसेट कक्षाओं का उपयोग कर रहा था, जो मैंने पाया था जब मैंने एक संपत्ति वर्चुअल ईएफ 5 एक आलसी भार (मेरे वर्चुअल गुण जहां डेटाबेस में अन्य ऑब्जेक्ट्स) किया था। इसका मतलब है कि मैं वर्चुअल प्रॉपर्टी के लिए एक नई प्राथमिक कुंजी प्राप्त करता हूं। खैर अगर मेरे पास ऑब्जेक्ट से जुड़ी एक विशिष्ट आईडी नहीं है, तो मैं संदर्भित करना चाहता हूं कि ईएफ 5 दो तरह के रिश्तों को बनाने की कोशिश करता है। यदि आप विशेष रूप से ईएफ को नहीं बताते हैं कि कौन सी संपत्ति डीबीसीएन्टेक्स्ट में मैप करने के लिए है, तो यह उसी ऑब्जेक्ट पर दो विदेशी कुंजी सेट करता है जिनकी अनुमति नहीं है। उम्मीद है की यह मदद करेगा।

+0

धन्यवाद मेरे प्रश्न का उत्तर देने की कोशिश करने के लिए। मुझे नहीं लगता कि यह मामला यहां है, हालांकि।मैंने पहले से ही 1: 1 को मुख्य क्लाइंट और बीपी क्लाइंट के बीच दो तरह के रिश्ते के रूप में स्थापित किया है (वर्चुअल गुणों के साथ-साथ आईडी दोनों)। मैं बस यह पता लगाने की कोशिश कर रहा हूं कि अचानक कोड क्यों काम करना बंद कर दिया। – IronMan84

+0

केवल वायरलल गुणों का उपयोग करके आलसी लोडिंग का कारण बनता है, क्या आपके पास गुणों के बीच आपके dbcontext में एक ही मानचित्र किया गया है? – Robert

+0

मैं डेटा एनोटेशन का उपयोग कर रहा हूं, फ्लुएंट एपीआई नहीं। मानचित्रण पूरी तरह से ऑब्जेक्ट पर है, डीबीकॉन्टेक्स्ट में नहीं। क्या आलसी लोडिंग के संबंध में 4.3 और 5.0 के बीच कुछ हुआ जो इस तरह से कोड को प्रभावित करेगा? – IronMan84