2013-04-21 11 views
6

मैं एक मौजूदा इकाई को अद्यतन करने का प्रयास कर रहा हूं।एक रेफरेंसियल अखंडता बाधा उल्लंघन

public MamConfiguration_V1 Save(MamConfiguration_V1 item) 
{ 
    mMaMDBEntities.MamConfiguration_V1.Attach(item); 
    mMaMDBEntities.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified); 
    mMaMDBEntities.SaveChanges(); 
    return item; 
} 

लेकिन Attach तरीकों एक अपवाद फेंकता है:

मैं निम्नलिखित कोड है

एक रेफेरेंन्शिअल सत्यनिष्ठा बाधा उल्लंघन हुआ: वे गुण मान निर्देशात्मक बाधाओं को परिभाषित के बीच संगत नहीं हैं संबंध में प्रमुख और आश्रित वस्तुओं।

मैं इसे कैसे ठीक कर सकते हैं?

उत्तर

3

आइटम ऑब्जेक्ट की परिभाषा क्या है? ऐसा लगता है कि इसके कुछ संग्रहों में जो अन्य संस्थाओं के साथ प्राप्ति सेट करते हैं, उनमें कुछ प्रकार का संघर्ष होता है। यह देखने के लिए कि क्या समस्या बनी रहती है, आप सभी संग्रहों को साफ़ करने का प्रयास कर सकते हैं, लेकिन इस मामले में आपने विदेशी कुंजी असाइनमेंट खो दिया है। लेकिन शायद यह समस्या का पता लगाने में आपकी मदद कर सकता है।

यह एक टिप हो सकता है। जब मैं संदर्भ के लिए एक मौजूदा इकाई संलग्न करने के लिए प्रयास करते हैं, मैं निम्न करने के लिए उपयोग करें:

mMaMDBEntities.Entry<MamConfiguration>(item).State = System.Data.EntityState.Modified; 

आप System.Data का उपयोग करते हुए हर समय इसे लिखने के लिए जरूरत से बचने के लिए जोड़ सकते हैं।

यह उस स्थिति में इकाई को संलग्न करता है जिसे आप चाहते हैं, इस मामले में संशोधित और परिवर्तनों को ट्रैक करें। यह दो की बजाय एक पंक्ति है।

8

ऐसा लगता है कि आपके पास item में विदेशी कुंजी फ़ील्ड और नेविगेशन प्रॉपर्टी के साथ कुछ संबंध हैं, और उन फ़ील्ड में विवादित मान हैं। ऐसा तब होता है जब आप किसी इकाई और इसकी संबंधित इकाइयों को लोड करते हैं, एक तरफ रिश्ते को बदलते हैं, केवल उस छोर को Modified के रूप में चिह्नित करें और सहेजने का प्रयास करें। सुनिश्चित करें कि आप दोनों सिरों पर रिश्ते को संशोधित करें और SaveChanges पर कॉल करने से पहले सभी प्रभावित इकाइयों को Modified के रूप में चिह्नित करें।

+1

किसी भी आसान तरीका बचाया इस्तेमाल किया? –

+2

सामान्य मामलों में, ईएफ स्वयं परिवर्तनों को ट्रैक करता है और आप ध्वज को मैन्युअल रूप से सेट किए बिना 'SaveChanges' को कॉल कर सकते हैं। डिस्कनेक्ट किए गए परिदृश्य में, कोई आसान तरीका नहीं है लेकिन आपको इसे मैन्युअल रूप से संशोधित के रूप में चिह्नित करना होगा। –

+0

मुझे यह त्रुटि मिली है, भले ही 'AutoDetectChangesEnabled' को सत्य पर सेट किया गया हो। मुझे संबंधित संस्थाओं की आवश्यकता नहीं थी इसलिए मैंने उन्हें लोड नहीं किया और इस मुद्दे को हल किया। –

4

मुझे इस अपवाद का सामना विभिन्न परिस्थितियों के तहत हुआ, और यहां पोस्ट कर रहा हूं क्योंकि त्रुटि संदेश खोजे जाने पर यह प्रश्न उठता है।

आंशिक रूप से लोड की गई इकाई के साथ IObjectContextAdapter.ObjectContext.AttachTo(entitySetName, entity) पर कॉल करते समय अपवाद फेंक दिया गया था। इकाई पर विदेशी कुंजी परिभाषित की गई थी, लेकिन नेविगेशन गुण लोड नहीं किए गए थे। (यानी, O.ItemID का मूल्य था, लेकिन O.Item शून्य था)। विशिष्ट परिस्थितियों को लोड होने के लिए O.Item की अनुमति नहीं दी गई थी।

समस्या निकला है कि वस्तु राज्य प्रबंधक एक अलग विधि में वस्तु भरी हुई थी और पहले से ही वस्तु एक ही कुंजी के साथ परिभाषित ट्रैकिंग किया गया था। चूंकि अलग-अलग विधि को ऑब्जेक्ट स्थिति को ट्रैक करने की आवश्यकता नहीं थी, इसलिए उस विधि के भीतर IQueryable.AsNoTracking() पर कॉल करके समस्या हल हो गई थी।

1

मेरे लिए मुद्दा यह था कि इकाई ढांचे ने मेरे ऑब्जेक्ट को कई स्थानों पर लोड किया था, इसलिए जब मैंने एक विदेशी कुंजी अपडेट की, तो अब एक ही ऑब्जेक्ट के दो संदर्भ थे, एक विदेशी कुंजी के साथ एक रिकॉर्ड करने के लिए इंगित करता है और एक बी रिकॉर्ड करने के लिए इंगित करने वाली एक विदेशी कुंजी, जिसने मेरे रिश्ते को एक से एक त्रुटि के कारण त्रुटि दी। यह हल करने के लिए, मैं context.Entry (वस्तु) .State = EntityState.Detached, वस्तु पुनः लोड, विदेशी कुंजी परिवर्तन किया और फिर बबल सामने संशोधित ध्वज को अपने परिवर्तनों

+0

धन्यवाद! यह मेरी समस्या तय है। – brady

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