2009-06-17 16 views
14

में SaveChanges को कॉल करते समय अमान्य ऑपरेशन अपवाद। मैं एंटिटी फ्रेमवर्क का उपयोग करने का तरीका सीखने की कोशिश कर रहा हूं लेकिन मैंने एक समस्या को हल किया है जिसे मैं हल नहीं कर सकता। मैं जो कर रहा हूं वह यह है कि मैं अपनी फिल्मों की एक सूची के माध्यम से चल रहा हूं और प्रत्येक को एक साधारण डेटाबेस में सम्मिलित करता हूं।.NET Entity Framework

यह जब मैं यह कर रहा db.SaveChanges() कि पढ़ा पर एक अपवाद मिल कोड मैं

private void AddMovies(DirectoryInfo dir) 
{ 
    MovieEntities db = new MovieEntities(); 
    foreach (DirectoryInfo d in dir.GetDirectories()) 
    { 
     Movie m = new Movie { Name = d.Name, Path = dir.FullName }; 
     db.AddToMovies(movie); 
    } 
    db.SaveChanges(); 
} 

उपयोग कर रहा हूँ है।

डेटाबेस में परिवर्तन सफलतापूर्वक लागू हुए थे, लेकिन वस्तु संदर्भ अपडेट करते समय एक त्रुटि हुई। ऑब्जेक्ट कॉन्टेक्स्ट एक असंगत स्थिति में हो सकता है। आंतरिक अपवाद संदेश: AcceptChanges जारी नहीं रख सकता क्योंकि ऑब्जेक्ट के प्रमुख मान ऑब्जेक्टस्टेट प्रबंधक में किसी अन्य ऑब्जेक्ट के साथ संघर्ष करते हैं। सुनिश्चित करें कि कुंजी मान AcceptChanges को कॉल करने से पहले अद्वितीय हैं।

मैं यह पता लगाने में सक्षम नहीं हूं कि इस समस्या का कारण क्या है। मेरे डेटाबेस तालिका तीन स्तंभ हैं
आईडी पूर्णांक autoincrement
नाम nchar (255)
पथ nchar (255)

अद्यतन: मैं जांच की गई मेरी edmx फ़ाइल और SSDL खंड StoreGeneratedPattern = "पहचान" के रूप में है सुझाव दिया। मैंने ब्लॉग पोस्ट का भी पालन किया और सीएसडीएल में क्लाइंटऑटो जेनरेटेड = "सच्चा" और स्टोर जेनरेटेड = "सच्चाई" को जोड़ने का प्रयास किया। इसके परिणामस्वरूप त्रुटियों को संकलित किया गया (त्रुटि 5: 'क्लाइंटऑटो जेनरेटेड' विशेषता की अनुमति नहीं है।)। चूंकि ब्लॉग पोस्ट 2006 से है और इसके बाद फॉलो अप पोस्ट का एक लिंक है, मुझे लगता है कि यह बदल दिया गया है।

हालांकि, मैं फॉलोअप पोस्ट नहीं पढ़ सकता क्योंकि ऐसा लगता है कि यह एक एमएसडीएन खाता की आवश्यकता है।

+1

मेरे लिए उत्तर संपत्ति पर 'StoreGeneratedPattern =" पहचान "सेट करना था, [अधिक जानकारी के लिए यहां देखें] (http://www.matthewedmondson.info/2012/09/entity-framework-and। एचटीएमएल)। –

+0

यह भी तब होता है जब आप INSERT, अद्यतन, DELETE के लिए SotredProcedure मैपिंग का उपयोग करते हैं और आपकी आईडी कुंजी एसपी के अंदर एक गणना कुंजी है। –

उत्तर

10

मैं इस का हल मिल गया।

क्या हुआ था कि जब मैंने अपनी तालिका बनाई तो मैं प्राथमिक कुंजी और सेट (पहचान पहचान) संपत्ति को हां में जोड़ना भूल गया। मैंने फिर अपना एंटिटी मॉडल बनाया और यह त्रुटि मिली।

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

कोई और अधिक अपवाद :)

6

यह अपवाद आपको यह बताने लगता है कि आपके पास आईडी कॉलम में सेवरल्स पंक्तियों में समान मान हैं, जो कि केवल अद्वितीय मान हैं, क्योंकि यह एक महत्वपूर्ण कॉलम है। इकाई फ्रेमवर्क ऐसे कॉलम को दो तरीकों से संभाल सकता है: या तो आप (क्लाइंट) अद्वितीय मान उत्पन्न करते हैं, या सर्वर अद्वितीय मान उत्पन्न करता है। आपके मामले में यह सर्वर को स्वत: संक्रमित कुंजी उत्पन्न करने की अनुमति देने के लिए तार्किक लगता है।

क्या आपके पास अपनी एसएसडीएल फ़ाइल में आईडी कॉलम के लिए StoreGeneratedPattern कुंजी सेट है?

यहाँ this blogpost से एक उदाहरण है:

<EntityType Name="rooms" Key="id"> 
    <Property Name="id" Type="int" Nullable="false" 
       StoreGeneratedPattern="Identity" /> 
    <Property Name="name" Type="nvarchar" Nullable="false" MaxLength="50" /> 
</EntityType> 
+0

ईएफ 4 में "पहचान" के बजाय "पहचान" है –

+1

@XMLforDummies: धन्यवाद, मैंने जवाब अपडेट किया है! –

+0

धन्यवाद! यह समस्या पिछले हफ्ते या तो मुझे पागल कर रही है। हालांकि मुझे फाइल को मैन्युअल रूप से संपादित करना पड़ा था। गुणों में इसे बदलने से केवल एक एनोटेशन चिह्न जोड़ा गया। – Htbaa

1

यदि आप एक bindingsource बाध्य है, तो आप suspendbinding बुलाना चाहिए:

 bs.SuspendBinding(); 
     Data.SaveChanges(); 
     bs.ResumeBinding(); 
7

पिछली बार मैं निम्नलिखित कोड की कोशिश की और मैं ने कहा कि यह काम कर रहा है ठीक

bs.SuspendBinding(); 
Data.SaveChanges(); 
bs.ResumeBinding(); 

महत्वपूर्ण चीजें जिन्हें मैं आपको बताता हूं वे हैं:

1- यदि हम बाइंडिंग को निलंबित करने के लिए उपर्युक्त कोड का उपयोग करते हैं तो हमें संग्रह में खोए गए इंडेक्स और मास्टर विवरण बाइंडिंग

2- यदि हम निम्नलिखित कोड का उपयोग करते हैं तो हम निम्नलिखित कोड का उपयोग करने के लिए अधिक कोड करना चाहते हैं। कोड ऊपर हम अपवाद चला देखेंगे और हर चीज ठीक हो जहां अधिक कोड लिखने की कोई जरूरत नहीं

 Data.SaveChanges(System.Data.Objects.SaveOptions.None); 

मुझे आशा है कि यह आपकी इसी तरह की समस्याओं को हल करती है जाएगा

आप दोस्तों

+0

नोट: System.Data.Objects.SaveOptions.None केवल .NET 4.0 में उपलब्ध है। – sfuqua

+1

यह केवल नेट 4.0 हो सकता है, लेकिन SaveOptions.None ने इसी मुद्दे के साथ मेरे लिए बहुत अच्छा काम किया है। –

+0

मैं ईएफ 5 या 6 में क्या उपयोग करता हूं? क्या कोई समकक्ष विकल्प coz है मुझे समान समस्या मिल रही है? धन्यवाद – lawphotog

2
System.Data.Objects.SaveOptions.None 
धन्यवाद

यह समस्या हल करता है लेकिन मुझे आश्चर्य है कि किसी को या अन्य विकल्पों को एकजुट करने के बीच क्या अंतर है।

0

जांच करें कि प्राथमिक कुंजी अपने etities, यदि हाँ, तो उन्हें बनाते हैं, और

"डाटाबेस से UpdateModel" कर इस समस्या को

0

इसके अलावा, अगर आप सेट की जाँच का समाधान करना चाहिए में से किसी में याद कर रहे हैं "पहचान" संपत्ति किसी अन्य कॉलम के लिए "हां" है और आप इसमें डुप्लीकेट मान डाल रहे हैं।

0

मुझे मुख्य पीढ़ी के लिए ऑरैकल 12 सी ऑटो-आईडी ट्रिगर के साथ ग्राहक-> ऑर्डर-> ऑर्डर-विवरण जैसे तीन स्तरों में फैले टेबल रिलेशनशिप के साथ एक ही समस्या थी। SaveChanges() का उपयोग करके सम्मिलन System.InvalidOperationException फेंक रहा था।

समाधान: बढ़ते कार्य SaveChanges(System.Data.Objects.SaveOptions.None) ऑब्जेक्ट ग्राफ़ की स्थिति में अस्थायी EntityKeys का उपयोग करने के लिए सिस्टम को रोकता है और परिणाम अपवाद से बचा जाता है।

+2

यह सवाल का जवाब नहीं है। यदि आपके पास एक और प्रश्न पोस्ट करने की तुलना में समान समस्या है। देखें [अच्छा जवाब कैसे लिखें] (http://stackoverflow.com/help/how-to-answer) –