2012-01-13 16 views
16
Error Message: Row not found or changed. 
Stack Trace: 
at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode) 
at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode) 

यह यादृच्छिक रूप से प्रतीत होता है। मुझे इन त्रुटियों को ईमेल किया गया है, और यूआरएल की सूचना हमेशा मेरे लिए काम करती है और हर किसी के लिए भी काम करनी चाहिए।लिंक पंक्ति नहीं मिली या

मैं द्वारा इस त्रुटि को ठीक कर सकते हैं:

  • मेरी dbml लेआउट
  • के लिए जा रहे
  • राइट क्लिक करें तालिका में हर क्षेत्र का चयन के कारण संघर्ष और Never
को संपत्ति Update Check सेट

ऐसा लगता है कि इन प्रकार की त्रुटियों को फेंक दिया जा रहा है।

हालांकि, जब भी मैं dmbl का मौका देता हूं, नई टेबल जोड़ता हूं, तो यह करना जारी रखना श्रमिक है। क्या इस समस्या को हल करने का कोई बेहतर तरीका है? मुझे इन दिनों 50-100 मिल रहा है जो मेरे आगंतुकों के लिए बुरा है।

+0

मैं जाँच चाहते हैं कि डेटा प्रकार और बातिल की कमी dbml और अपने डेटाबेस के बीच ठीक प्रकार से दिखाई। – codingbadger

+0

@ बैरी हाँ वे सब करते हैं, मैंने प्रत्येक तालिका को फिर से जोड़ा है –

उत्तर

27

हर बार जब मैंने यह त्रुटि देखी है, तो इसका मतलब है कि डेटाबेस में कुछ रिकॉर्ड/ऑब्जेक्ट/जो भी और जब मैं इसे सहेजने की कोशिश कर रहा था, के बीच कुछ बदल गया। असफल होने के कारण, ऐसा इसलिए था क्योंकि काम की मेरी इकाई बहुत बड़ी थी।

मुझे आपके आवेदन की सटीक प्रकृति नहीं पता है, लेकिन मुझे लगता है कि आप एक डेटा संदर्भ बना रहे हैं, रिकॉर्ड रिकॉर्ड कर रहे हैं या रिकॉर्ड की सूची लोड कर रहे हैं, कुछ संचालन कर रहे हैं, कुछ समय और प्रोसेसर चक्र चबाने, और फिर अंत में संशोधित डेटा को डेटाबेस में सहेजने की कोशिश कर रहा है। हो सकता है कि रिकॉर्ड/ऑब्जेक्ट का एक उदाहरण भी लोड हो और इसे थोड़ी देर के लिए क्लास वैरिएबल में संग्रहीत किया जा सके, और उसके बाद पेज लोड या थ्रेड के अंत में या जो कुछ भी बदलेगा उसे वापस सहेजने की कोशिश कर रहा हो। समस्या यह है कि क्योंकि LINQ ने उस की एक प्रति संग्रहित की है, वह प्रतिलिपि है जिसे वह अपडेट करना चाहता है। यदि अंतर्निहित डेटा इस दौरान बदल जाता है, तो यह पागल हो जाता है।

अपने आप से यह पूछें, क्या होगा यदि आप अपने ऑब्जेक्ट्स के पूरे जीवनकाल के लिए अपने डेटा पर लॉकिंग लेनदेन डालते हैं। जो कुछ भी आप लोड करते हैं उसे संशोधित करें, उस समय के दौरान किसी और को इसे छूने की अनुमति नहीं दी जाएगी। असल में यह धारणा है। अनुमोदित, LINQ इसके बारे में थोड़ा अधिक आशावादी है, यदि आप कभी भी डेटा अपडेट नहीं कर रहे हैं, तो पंक्ति या तालिका को लॉक करने में कोई समझ नहीं है, लेकिन आप उन समस्याओं के माध्यम से सोचते हैं। अपने आप से पूछें कि क्या आप अपनी वस्तुओं पर सख्त लेनदेन वाले ताले लगाएंगे, और शायद आपको अपमानजनक कोड पर इंगित करेंगे।

मेरा समाधान यह है कि मेरी इकाई की कार्य को जितना संभव हो सके छोटा रखें। ऑब्जेक्ट को लोड न करें और अपनी कार्यशील प्रतिलिपि के रूप में इसका उपयोग करें और इसे एक डेटाबेस में वापस डेटाबेस में संग्रहीत करें। इसके बजाए, ऑब्जेक्ट लोड करें और एक चरण में आपको जो जानकारी चाहिए उसे खींचें, फिर उन परिवर्तनों को समझें जिन्हें आपको लागू करने की आवश्यकता है, और फिर ऑब्जेक्ट लोड/अपडेट/सेव करें। निश्चित रूप से यह डेटाबेस के लिए और अधिक दौर यात्रा का कारण बनता है, लेकिन आपको एक बेहतर आश्वासन देता है कि आप डेटा की नवीनतम प्रतिलिपि के साथ काम कर रहे हैं। यह अभी भी "आखिरी में जीत जाएगा", जिसका अर्थ यह है कि अगर डेटा के साथ काम करते समय कोई अपडेट करता है तो यह खो सकता है, लेकिन जब तक आप लेनदेन के साथ रिकॉर्ड लॉक नहीं करते तब तक यह हमेशा जोखिम होता है। हालांकि, यह आपको flexiblity खरीदता है कि अगर कोई और एक ही पंक्ति में असंबंधित क्षेत्रों को संशोधित कर रहा है, तो आप दोनों एक साथ उस डेटा पर काम कर सकते हैं।

+0

धन्यवाद, यह एक अच्छा जवाब है। हालांकि इसे हल्के पृष्ठों पर विचार करने वाले कुछ लोगों पर फेंक दिया गया है, हमारा सर्वर बिल्कुल शक्तिशाली नहीं है और हम जल्द ही उन्नयन की योजना बना रहे हैं। यदि सर्वर थोड़ा धीमा है, तो क्या यह हर बार इस त्रुटि को फेंक सकता है और फिर जब यह व्यस्त हो जाता है? हम मासिक पृष्ठ दृश्यों की एक उचित संख्या को संसाधित करते हैं –

+0

हाँ, हल्के और धीमे सभी एक परिवर्तनीय स्लाइडिंग पैमाने हैं। यदि सर्वर धीमा हो रहा है, तो पृष्ठ अपेक्षाकृत भारी वजन हैं। यदि साइट धीमी हो जाती है, तो थ्रेड को एक दूसरे के साथ संघर्ष करने का अधिक अवसर होता है –

+0

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

2

गेटटेबल()। संलग्न करें (नई एंटीटी, मूल एंटीटी);

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

49

मुझे एक ही समस्या थी, और इसे डीबीएमएल से डीबी संरचना की तुलना करके हल किया गया। एक संपत्ति को रद्द करने के लिए सेट नहीं किया गया था, और यह मुद्दा पैदा कर रहा था।

तो अपने डीबीएमएल, और शून्य गुणों की जांच करें।

+0

यह मेरा मामला था, धन्यवाद। – GerManson

+0

यह वास्तव में मेरे लिए था, धन्यवाद। – mariocatch

+0

+1, संदर्भ को रीफ्रेश करने से समस्या को हल किया गया - टिप – agrath

1

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

0

मुझे यह त्रुटि विंडोज फोन 8 पर मिल रही थी। और मुझे यह समझने में थोड़ी देर लग गई कि समस्या क्या थी। असल में यह यह था:

मेरे पास ट्रैकिंगिंग नामक एक कक्षा थी। 1. किसी सर्वर से मैंने इसका एक अद्यतन संस्करण प्राप्त किया। 2. मेरी टाइल सेवा ने इसकी जानकारी के साथ द्वितीयक टाइल अपडेट की है और (!!) 1 संपत्ति अपडेट की है और इसे फोन पर स्थानीय डेटाबेस में सहेजा गया है। 3. मैंने ऑब्जेक्ट के पहले उदाहरण को फिर से सहेजने की कोशिश की और यहां मुझे त्रुटि मिली "पंक्ति नहीं मिली या बदली"।

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

मैं तब तक इंतजार नहीं कर सकता जब तक ईएफ 7 विंडोज फोन पर न आए, WP8 पर वर्तमान ईएफ के साथ इतना सिरदर्द।

1

एसक्यूएल प्रोफाइलर का उपयोग करते हुए मैं अपने सर्वर की ओर एसक्यूएल लेनदेन पर नज़र रखी और महसूस किया कि SubmitChanges() पर प्रेषित UPDATE बयान WHERE खंड में एक गलत मान शामिल हैं। इसका कारण यह है कि मैं एक संपत्ति है कि इस तरह दिखता है:

class Position{ 
... 
    [Column] 
    public int Pieces{ 
     get{ 
      this.pieces = this.Transformers.Count; 

      return this.pieces; 
     } 
     set{ this.pieces = value; } 
    } 
... 
} 

Transformers के बाद से एक List<Transformers> तत्व है कि एक और Transformers मेज पर एक-से-अनेक संबंधों की एक सूची का प्रतिनिधित्व करता है, मैं मैन्युअल रूप से प्रत्येक के साथ सूची को भरने के लिए है Transformer जिसमें मेरी Position ऑब्जेक्ट की एक विदेशी कुंजी है। यदि, किसी कारण से, मैं ऐसा नहीं करता, तो मुझे उल्लेख की गई त्रुटि मिल जाएगी क्योंकि Pieces संपत्ति मूल मूल्य से पक्षपातपूर्ण है।

इस प्रकार, SubmitChanges() पर SQL विवरण एक प्रवेश WHERE Pieces = somevalue लेकिन प्रविष्टि में Pieces के वास्तविक मूल्य anothervalue है के लिए खोज करेंगे। तो मूल रूप से LINQ सोचता है कि आपने डीबी में कुछ बदल दिया है, क्योंकि डीबी इस अनुरोध के लिए कोई मूल्य नहीं लौटाएगा।

के रूप में कहा गया है, एक समाधान है:

[Column(UpdateCheck=UpdateCheck.Never)] 
    public int Pieces 
    { 
     get { 
      this.pieces= this.Transformers.Count; 

      return this.pieces; 
     } 
     set { this.pieces= value; } 
    } 

बेशक यह भी आसानी से की तरह

getPieces(){ 
    return this.Transformers.Count(); 
} 

एक सरल गेटर समारोह और एक "निष्पक्ष" संपत्ति की स्थापना करके हल किया जा सकता

class Position{ 
... 
    [Column] 
    public int Pieces{ 
     get{ return this.pieces; } 
     set{ this.pieces = value; } 
    } 
... 
} 

मुझे उम्मीद है कि यह किसी के लिए मदद की जा सकती है। मैं इसे भी पोस्ट करता हूं क्योंकि अगर किसी और के पास पहले था, तो उसने मुझे अपने जीवन के घंटे बचाए होंगे।

2

यह तब भी हो सकता है जब कोई डेटाबेस ट्रिगर आपके द्वारा अपडेट की जा रही पंक्ति में किसी भी कॉलम को बदलता है - भले ही आप उस विशेष कॉलम को अपडेट नहीं कर रहे हों।

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

0

अद्यतन करने LINQ

+0

हालांकि यह समस्या को हल करने के लिए एक महत्वपूर्ण संकेत हो सकता है, एक अच्छा जवाब भी समाधान का प्रदर्शन करता है। कृपया अपना नाम दिखाने के लिए उदाहरण कोड प्रदान करने के लिए [संपादित करें]। वैकल्पिक रूप से, इसे इसके बजाय टिप्पणी के रूप में लिखने पर विचार करें। –

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