2010-06-10 19 views
15

के साथ Autonumber मैं वस्तुओं के संग्रह के माध्यम से लूप करना चाहता हूं और उन्हें सभी को एक टेबल में जोड़ना चाहता हूं। गंतव्य तालिका में एक ऑटो-वृद्धि क्षेत्र है। अगर मैं एक वस्तु जोड़ता हूं तो कोई समस्या नहीं है। यदि मैं दो वस्तुओं को शून्य की प्राथमिक कुंजी के साथ जोड़ता हूं, तो इकाई ढांचा विफल हो जाता है। मैं प्राथमिक कुंजी को मैन्युअल रूप से निर्दिष्ट कर सकता हूं लेकिन ईएफ की कोशिश करने का पूरा बिंदु जीवन को आसान बनाना अधिक जटिल नहीं था। यहां कोड और अपवाद प्राप्त हुआ है।इकाई फ्रेमवर्क

foreach (Contact contact in contacts) 
{    
    Instructor instructor = InstructorFromContact(contact);    
    context.AddToInstructors(instructor);    
} 

try 
{     
    context.SaveChanges();     
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.ToString()); 
} 

त्रुटि है:

System.InvalidOperationException: डेटाबेस में परिवर्तन सफलतापूर्वक लागू हुए थे लेकिन वस्तु संदर्भ अपडेट करते समय कोई त्रुटि हुई। ऑब्जेक्ट कॉन्टेक्स्ट एक असंगत स्थिति में हो सकता है। आंतरिक अपवाद संदेश: AcceptChanges जारी नहीं रह सकता क्योंकि ऑब्जेक्ट के प्रमुख मान ऑब्जेक्टस्टेट प्रबंधक में किसी अन्य ऑब्जेक्ट के साथ संघर्ष करते हैं। सुनिश्चित करें कि कॉलिंग AcceptChanges से पहले महत्वपूर्ण मान अद्वितीय हैं। \ परियोजनाओं \ DataMigration \ Program.cs: System.Data.Objects.ObjectContext.SaveChanges (SaveOptions विकल्प)
System.Data.Objects.ObjectContext.SaveChanges() सी में DataMigration.Program.CopyInstructors() में कम से कम : लाइन 52

+3

मेरा अनुमान है कि यह है कि अगर तुम सिर्फ autonumber क्षेत्र को खाली छोड़ देते हैं, डेटाबेस आप के लिए एक प्रदान करेंगे जब आप करते हैं। –

+0

हां यह काम करता है, यह रिकॉर्ड जोड़ता है और प्राथमिक कुंजी असाइन करेगा समस्या यह है कि मुझे इस तरह के विशिष्ट परिदृश्य के लिए अपवाद नहीं मिलना चाहिए। मुझे यकीन है कि ढांचे के भीतर ऐसा करने का 'सही' तरीका है, बस यह सुनिश्चित न करें कि कैसे। – dcompiled

+0

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

उत्तर

18

स्टोर जेनरेटेड पैटर्न विशेषता को अपने एसएसडीएल में ऑटोइनक्रिएटमेंट फ़ील्ड के लिए "पहचान" पर सेट करें। यह मदद करनी चाहिए।

+7

ध्यान दें कि आप इस संपत्ति को केवल डिजाइनर में सेट नहीं कर सकते हैं, आपको एसएसडीएल अनुभाग को हाथ से संपादित करना होगा। मैंने इस जवाब को पीछे पढ़ा और सोचा: "मैंने पहले से ही ऐसा कर लिया है।", और मैंने देखा, मैं * एसएसडीएल * पर ध्यान देकर घंटे बचा सकता था यह डिजाइनर में एक बग है। http://geeksharp.com/2010/05/27/ef4-bug-in-storegeneratedpattern-ssdl/ और http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/404d3017-01b7 -4129-8e05-f4aa48f15f08 – DanO

+0

आप इस पर वजन करना चाहते हैं: http://meta.stackexchange.com/questions/82509/should-accounts-used-by-multiple-users-be-allowed/82519#82519 – smartcaveman

+0

@ इसे छोड़ दें, मेरे लिए हल नहीं किया .. – Campinho

12

ऐसा इसलिए होता है क्योंकि डेटाबेस में कॉलम के स्वत: जेनरेट किए गए मान के बावजूद ईएफ को इसके बारे में कभी नहीं पता था।

तो, ईएफ को सूचित करने के लिए कि डीबी जेनरेट किए गए मान को संभालेगा, आपको अपनी एडीएमएक्स फ़ाइल खोलनी होगी (मैं हमेशा ऐसा करने के लिए वीएस के एक्सएमएल संपादक का उपयोग करता हूं) और स्टोर स्कीमा परिभाषा भाषा (एसएसडीएल) में क्षेत्र, जेनरेट पैटर्न की आवश्यकता वाले कॉलम में विशेषता StoreGeneratedPattern = "पहचान" जोड़ें। इस तरह ईएफ डीबी में उत्पन्न मूल्य को पढ़ता है और इसे मेमोरी कैश में संग्रहीत करता है।

आपका इकाई प्रकार परिभाषा और अधिक या कम इस तरह दिखेगा:

<EntityType Name="INVOICE"> 
      <Key> 
      <PropertyRef Name="CODE" /> 
      </Key> 
      <Property Name="CODE" Type="varchar" Nullable="false" 
       MaxLength="10" StoreGeneratedPattern="Identity"/>     
</EntityType> 

ध्यान रखें कि अगर आप अपने मॉडल को अद्यतन करने के हो इन सभी परिवर्तन गुम हो जाएंगे और आप सभी पूरी प्रक्रिया को दोहराने के लिए होगा ।

यह ईएफ 1.0 के लिए काम करता है, मुझे यकीन नहीं है कि अगर ईएफ 4 में इन सभी मुद्दों को पहले ही तय कर दिया गया है।

+2

मुझे लगता है कि मैं गलत कहां गया था, उसमें मैंने शुरुआत में डेटाबेस से मॉडल बनाया और ऑटोनंबर फ़ील्ड सेट करना भूल गया। बाद में मैंने अपना डेटाबेस संपादित किया और दृश्य स्टूडियो 2010 के भीतर "डेटाबेस से अद्यतन मॉडल" कमांड के बाद इस संपत्ति को सेट किया। अद्यतन सुविधा नई गुणों को जोड़ती है लेकिन यह बिल्कुल सही नहीं है कि यह मौजूदा संशोधित गुणों को सही तरीके से 'ठीक करता है'। मेरे मॉडल को हटाने और स्क्रैच से पुनर्निर्माण करके, ऑटोनंबर सुविधा अपेक्षित के रूप में काम करती है। हालांकि मैं बेहतर जानता था, मैंने आपके विचार की कोशिश की होगी। – dcompiled

+0

वर्तमान में (लेकिन उम्मीद है कि जल्द ही!) मैं ईएफ 4 का उपयोग नहीं कर रहा हूं, हालांकि मैंने इस पृष्ठ में कुछ पढ़ा है जो इस बारे में बात करता है: http://geeksharp.com/2010/05/27/ef4-bug-in-storegeneratedpattern-ssdl/ – cepriego

+2

माइक्रोसॉफ्ट वीएस -2010SP1 के लिए यहां एक हॉटफिक्स प्रदान करता है। http://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=37957 ऐसा लगता है कि यह मेरे लिए काम करता है। – kimsk

2

मैं EF6 उपयोग कर रहा हूँ, StoreGeneratedPattern स्थापित करने के लिए, आप भी दृश्य स्टूडियो में खुला edmx फ़ाइल कोशिश कर सकते हैं, सही तालिका में डेटा कॉलम पर क्लिक करें और गुण,

तो फिर तुम करने के लिए None से सेट कर सकते हैं Identity गुण विंडो में:

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