मैं अब अपने एएसपी.नेट एमवीसी एप्लिकेशन पर महीनों के लिए काम कर रहा हूं। जब मैंने पहली बार इस पर काम करना शुरू किया तो मैं एंटिटी फ्रेमवर्क 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 में डेटाबेस ने उस कोड के साथ डेटाबेस को इतना अनियमित बना दिया है?
क्या कोई जानता है कि ऐसा क्यों हुआ होगा?
यह आपकी मदद कर सकता है। ईटी 4.3 से एंटीटी फ्रेमवर्क 5 एनम्स और मूविंग सॉल्यूशन http://thedatafarm.com/blog/data-access/video-entity-framework-5-enums-and-moving-solution-from-ef-4-3/ – Aru