2010-09-03 8 views
6

मैं एक मुद्दा एक विदेशी कुंजी क्षेत्र अपडेट करने का प्रयास में भाग:मैं LINQ से SQL/SQLMetal में कुशलतापूर्वक एक विदेशी कुंजी कैसे अपडेट करूं?

record.ForeignId = newId; 

यह साथ बम SQLMetal कोड कि System.Data.Linq.ForeignKeyReferenceAlreadyHasValueException() फेंकता की वजह से "ऑपरेशन नहीं वैध वस्तु की वर्तमान स्थिति की वजह से है।"

LinqToSQL Error : Operation is not valid due to the current state of the object और http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/f9c4a01a-195a-4f2b-a1cb-e2fa06e28b25/, इस पर चर्चा दूसरों के बीच:

मैं पहली बार इस मुद्दे को हिट करने के लिए नहीं था।

उनके समाधान यह है:

record.Foreign = Database.Foreigns.Single(c => c.Id == newId); 

के पाठ्यक्रम विदेशी पर एक डीबी देखने का कारण बनता है सिर्फ एक वस्तु वापस ईद मैं पहले से ही पता है कि प्राप्त करने के लिए, यही कारण है कि! तो, मैं बिना किसी व्यर्थ क्वेरी के इस अद्यतन को कैसे पूरा करूं (या प्रश्न अगर मेरे पास इनमें से बहुत सारे एफके हैं)?

उत्तर

3

आप माता-पिता के एक उदाहरण (सही आईडी के साथ), Attach को मौजूदा रिकॉर्ड स्थिति के रूप में डेटाकॉन्टेक्स्ट में नया कर सकते हैं, फिर अपने बच्चे के ऑब्जेक्ट की मूल संपत्ति असाइन करें।

यहाँ कुछ कोड है:

int theId = 5; 
Parent p = new Parent() { Id = theId}; 
dc.Parents.Attach(p); 
child.Parent = p; 
+0

मुझे अटैच() के बारे में पता नहीं था, लेकिन मैंने कोशिश की और एक डुप्लिकेट कुंजी त्रुटि मिली: "एक कुंजी के साथ एक इकाई नहीं जोड़ सकता जो पहले से उपयोग में है।" क्या यह डीबी से यह पता लगाने के लिए पूछताछ करता था, या वह रिकॉर्ड शायद मेरे डेटा संदर्भ में लटक रहा था ...? –

+0

डेटाकॉन्टेक्स्ट उन सभी रिकॉर्ड ट्रैक करता है जिन्हें उन्होंने लोड किया है (प्राथमिक कुंजी द्वारा)। अगर उसने आईडी = 5 के साथ एक अभिभावक लोड किया है, तो आप आईडी = 5 के साथ माता-पिता का एक और उदाहरण संलग्न नहीं कर पाएंगे। –

+0

और क्या यह देखने का कोई तरीका है कि कोई कैश किया गया है और अगर यह करता है तो इसे बाहर निकाल दें? और अन्यथा आपके उत्तर में एक नया जीन अप करें? या शायद इसे पहले छोड़ने के लिए कहें? या इस योजना को बनाने के लिए कुछ भी काम करते हैं? –

1

यह समस्या का समाधान नहीं करता है, लेकिन एक तरह से आंशिक रूप से अतिरिक्त भार से बचने के लिए मौजूदा मूल्य नया मान से अलग है देखने के लिए जाँच करने के लिए है। यदि यह अलग है, तो आप क्वेरी करेंगे। कुछ ऐसा -

if(obj.PropertyID != newValue){ 
    obj.Property = PropertyClass.Load(newValue) 
} 
0

मुझे एक ही समस्या थी। मैंने एक त्वरित काम किया, शायद सबसे अच्छा समाधान नहीं (क्योंकि यह प्रदर्शन को प्रभावित कर सकता है), लेकिन यह मेरे लिए काम करता था।

मेरे समाधान में मेरे पास कक्षा डेटा पर घोषित मेरे डेटाकॉन्टेक्स्ट के साथ एक कक्षा है, इसलिए मैं इसे पूरे समय उपयोग कर सकता हूं।

मेरे समाधान में मैं बस इतना करना चाहता था (आपके समान) किसी उपयोगकर्ता के लिए एक खाता प्रकार आईडी (डेटाबेस में ये एफके हैं) में खाता प्रकार आईडी बदल दिया गया था।

चूंकि डेटाकॉन्टेक्स्ट पहले ही लोड हो चुका था, इसलिए यह परिवर्तन की अनुमति नहीं दे रहा था। चारों ओर काम?

मैंने एक फ़ंक्शन बनाया जहां मैं डेटाकॉन्टेक्स्ट का एक नया उदाहरण बनाता हूं, मेरी LINQ क्वेरी चलाता हूं, परिवर्तन सबमिट करता हूं और उसके बाद डेटाकॉन्टेक्स्ट का निपटान करता हूं।

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