2011-01-03 6 views
15

मैं इस त्रुटि मिलती है अगर मैं इन चरणों का पालन: एक वस्तु (एक संबद्ध इकाई संपत्ति) कीसदस्य 'एक्स' संघ के सदस्य के साथ असंगत हो में बदल गया था 'वाई

  1. संपत्ति बदलें Y
  2. परिवर्तन सबमिट करने का प्रयास
  3. इस बिंदु पर वाई का मान और एक्स (अंतर्निहित कुंजी) का मान अनुबंध में नहीं है - LINQ से SQL स्पष्ट रूप से इन्हें सिंक्रनाइज़ नहीं करता है जब तक GetChangeSet को कॉल नहीं किया जाता है।
  4. अद्यतन ऑपरेशन के दौरान कुछ व्यावसायिक तर्क या डेटाबेस स्तर की बाधा के कारण एक अपेक्षित त्रुटि उत्पन्न होती है।
  5. इस बिंदु पर वाई का मान X के साथ अनुबंध में है क्योंकि GetChangeSet को बुलाया गया था।
  6. वाई से कुछ भी नहीं (उर्फ नल) का मूल्य बदलें।
  7. GetChangeSet पर कॉल करें।

त्रुटि अंतिम चरण पर होती है क्योंकि एक्स का मान और एक्स का मूल मान (GetOriginalEntityState द्वारा लौटाया गया) अलग है, और नया मान वाई से सहमत नहीं है? क्या यही कारण है? क्या यह LINQ से SQL में एक बग है। ऐसा होना चाहिए क्योंकि अगर मैं चरण 5 के दौरान वाई को दूसरे (गैर-शून्य) मान में बदलता हूं तो मुझे वही व्यवहार दिखाई नहीं देता है। इसके आसपास क्या सही तरीका है? मैं कुछ तरीकों से देख सकता हूं:

  1. त्रुटि होने पर डेटा कॉन्टेक्स्ट को छोड़ दें और यूआई को छोड़ दें। मुझे यह पसंद नहीं है क्योंकि तब आशावादी कोकुरेंसी परिवर्तन विवादों का पता नहीं लगाया जा सकता है। नए संदर्भ में मूल मान नहीं हैं जो यूआई की आबादी के साथ ही पॉप्युलेट किए गए थे, इसलिए यदि यूआई में इसमें कोई पुराना मूल्य है, तो वे डेटाबेस में डेटा को वापस करने का कारण बनेंगे।
  2. डेटाकॉन्टेक्स्ट (ओवरराइट कंटेंट) को रीफ्रेश करें और यूआई को जैसा छोड़ दें। मुझे # 1 के समान कारण के लिए यह पसंद नहीं है।
  3. डेटाकॉन्टेक्स्ट (ओवरराइट कंटेंट) को रीफ्रेश करें और यूआई को फिर से पॉप्युलेट करें। मुझे यह पसंद नहीं है क्योंकि तब उपयोगकर्ता को दिए गए त्रुटि संदेश उपयोगकर्ता को उनके द्वारा किए गए त्रुटि को नहीं दिखाता है और उन्हें इसे सही करने की अनुमति देता है। यह उपयोगकर्ता द्वारा किए गए सभी अन्य परिवर्तनों को भी त्याग देता है।
  4. जब त्रुटि होती है, तो वाई के मूल मान को स्पष्ट रूप से पुनर्प्राप्त करें और वाई को रीसेट करें, फिर X को पुनः सिंक्रनाइज़ करने के लिए GetChangeSet को कॉल करें (एक्स केवल पढ़ने या निजी है इसलिए मैं इसे सीधे रीसेट नहीं कर सकता)। ऐसा लगता है, लेकिन एक हैक की तरह लगता है, और अन्य समान त्रुटियों के लिए बहुत सारे कोड की आवश्यकता हो सकती है।

क्या कोई बेहतर समाधान है। क्या यह कुछ है जो रिपोर्ट किया जाना चाहिए?

+0

क्या आप स्पष्ट कर सकते हैं कि आपका क्या मतलब है "2. इस बिंदु पर वाई का मूल्य और एक्स (अंतर्निहित कुंजी) का मान अनुबंध में नहीं है।" निश्चित रूप से आप इकाई की प्राथमिक कुंजी संपत्ति नहीं बदल रहे हैं, लेकिन कुछ अन्य फ़ील्ड, है ना? –

+0

दाएं। मान लें कि मेरे पास ऑर्डर ऑब्जेक्ट है, और गुणों में से एक को ग्राहक कहा जाता है जो दर्शाता है कि किस ग्राहक ने ऑर्डर दिया था। यह वाई का प्रतिनिधित्व करता है। उस लिंक को छिपी हुई संपत्ति जैसे _CustomerId द्वारा कवर के तहत दर्शाया गया है। यह एक्स का प्रतिनिधित्व करता है। मैं आदेश से जुड़े ग्राहक को बदल सकता हूं। ग्राहक नए ग्राहक ऑब्जेक्ट का संदर्भ लेंगे, लेकिन _CustomerId GetChangeSet कहलाए जाने तक ग्राहक आंतरिक _Id मान को प्रतिबिंबित नहीं करेगा। – BlueMonkMN

उत्तर

0

ऐसा लगता है कि इस बग की तरह नवीनतम नेट और/या दृश्य स्टूडियो में तय किया गया है 2010 dbml फ़ाइल के लिए तैयार किए गए कोड अब कोड अंतर्निहित विदेशी कुंजी मान भी अद्यतन करने के लिए जब की स्थापना शामिल अशक्त करने के लिए संघ संपत्ति:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Customer_Order", Storage="_Customer", ThisKey="fkCustomer", OtherKey="id", IsForeignKey=true)] 
    public Customer Customer 
    { 
     get 
     { 
      return this._Customer.Entity; 
     } 
     set 
     { 
      Customer previousValue = this._Customer.Entity; 
      if (((previousValue != value) 
         || (this._Customer.HasLoadedOrAssignedValue == false))) 
      { 
       this.SendPropertyChanging(); 
       if ((previousValue != null)) 
       { 
        this._Customer.Entity = null; 
        previousValue.Orders.Remove(this); 
       } 
       this._Customer.Entity = value; 
       if ((value != null)) 
       { 
        value.Orders.Add(this); 
        this._fkCustomer = value.id; 
       } 
       else 
       { 
        this._fkCustomer = default(Nullable<int>); 
       } 
       this.SendPropertyChanged("Customer"); 
      } 
     } 
    } 

मुझे लगता है कि this._fkCustomer = default(Nullable<int>); चाहिए कोड में वहाँ नहीं किया गया है मैं परीक्षण किया गया था जब मैं मूल रूप से इस प्रश्न पोस्ट। तो या तो मैंने अपना डीबीएमएल गलत स्थापित किया था, या यह समस्या तय की गई थी।

0

प्रति MSDN:

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

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

http://msdn.microsoft.com/en-us/library/Bb386982(v=VS.90).aspx

+0

दूसरे शब्दों में -> संचालन के आदेश। पहले अपने ग्राहक ऑब्जेक्ट को बनाएं/अपडेट करें और परिवर्तन सबमिट करें। फिर ऑर्डर ऑब्जेक्ट बनाएं। ग्राहक आईडी के साथ संबद्ध आदेश। तबदीली भेजे। – bleepzter

+0

एसोसिएशन सेट करते समय समस्या मौजूद नहीं है। इसे साफ़ करने की कोशिश करते समय यह मौजूद है। दोनों ऑब्जेक्ट्स पहले ही डेटाबेस में हैं। और मैंने कभी विदेशी कुंजी को छुआ नहीं। LINQ-to-SQL अद्वितीय केस में सिंक्रनाइज़ करने में विफल रहा जहां एक शून्य संदर्भ शामिल है। जब मैंने त्रुटि के बाद माता-पिता से बच्चे को अलग करने की कोशिश की, तो मुझे यह त्रुटि अगले GetChangeSet पर मिल गई। – BlueMonkMN

0

मुझे हाल ही में linq से sql का उपयोग करके इस समस्या का अनुभव होता है, मेरी कक्षाएं जहां वर्गमीटर के साथ उत्पन्न होती है, और WPF बाइंडिंग का उपयोग करके प्रदर्शित होती है।

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

(Address.provID 1 होगा और Address.Province अशक्त होगा)

मैं अद्यतन SelectedItem और नहीं SelectedValuePath अद्यतन करने के लिए बाध्य है।

<ComboBox Name="provList" DisplayMemberPath="Code" ItemsSource="{Binding Source={x:Static list:GlobalList.ProvinceList}}" SelectedItem="{Binding Path=Provinces}" Width="75" Height="23" HorizontalAlignment="Left" Margin="5,0,0,0" VerticalAlignment="Top"/> 
संबंधित मुद्दे