2010-05-17 14 views
6

यह अजीब है ... अपडेट किए गए अपडेट पहले से लोड होते हैं लेकिन यह नहीं पता कि यह अलग क्यों है। हालांकि मैं अब .NET 4.0 का उपयोग कर रहा हूं - हालांकि मुझे इसके एल 2 एस कार्यान्वयन में एक बग संदेह है। ऐसा नहीं है इसका एक अद्भुत और अद्भुत आवेदन है। हालांकि मुझे यकीन है कि यह कोड काम करता है जबकि मैं आरसी का उपयोग कर रहा था।Linq2Sql - अद्यतन करने का प्रयास कर रहा है लेकिन एसक्यूएल में सेट स्टेटमेंट खाली है

मैंने नीचे दी गई जानकारी का उपयोग करके एक परियोजना को खरोंच से बनाकर इस त्रुटि को पुन: पेश करने में भी कामयाब रहा है।

समस्या यह है कि L2S द्वारा उत्पन्न अद्यतन विवरण में सेट स्टेटमेंट में कोई फ़ील्ड नहीं है। मैंने यह जांचने की कोशिश की है कि पीके सेट है (केवल कारण है कि मुझे लगता है कि जहां कहीं भी क्षेत्र में आवश्यक क्षेत्र की आवश्यकता होगी) और अन्य डीबीएमएल गुणों को भी पढ़ा जाए। मैं लगभग 1 साल के लिए linq2Sql का उपयोग कर रहा हूं और मुझे कोई समस्या नहीं है .. मुझे अभी भी लगता है कि मुझे बस एक बड़ा मस्तिष्क फार्ट है।

नोट: मैंने कुछ फ़ील्ड को हटाने के लिए बराबर और GetHashCode विधियों को साफ़ कर दिया है - समस्या इसके बाद बनी रहती है। हालांकि मैंने एसक्यूएल को साफ नहीं किया है।

मैं dbml से एक ग्राहक वर्ग है मैं एक विधि अद्यतन कहा जाता है

public partial class Client : ICopyToMe<Client> 

CopyToMe विधि एक अंतरफलक

public interface ICopyToMe<T> 
    { 
     void CopyToMe(T theObject); 
    } 

भी वर्ग getHashCode अधिरोहित है

public override int GetHashCode() 
{ 
    int retVal = 13^ID^name.GetHashCode(); 
    return retVal; 
} 
से प्राप्त होती है

और

के बराबर है
public override bool Equals(object obj) 
{ 
    bool retVal = false; 
    Client c = obj as Client; 
    if (c != null) 
     if (c.ID == this.ID && c._name == this._name) 
      retVal = true; 
    return retVal; 
} 

आंशिक वर्ग

public void UpdateSingle() 
     {   
      L2SDataContext dc = new L2SDataContext(); 
      Client c = dc.Clients.Single<Client>(p => p.ID == this.ID); 
      c.CopyToMe(this); 
      c.updatedOn = DateTime.Now; 

      dc.SubmitChanges(); 
      dc.Dispose(); 
         } 

CopytoMe विधि

public void CopyToMe(Client theObject) 
     { 
      ID = theObject.ID; 
      name = theObject.name;     
     } 

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

exec sp_executesql N'UPDATE [dbo].[tblClient] 
SET 
WHERE ([ID] = @p0) AND ([name] = @p1) AND ([insertedOn] = @p2) AND ([insertedBy] = @p3) AND ([updatedOn] = @p4) AND ([updatedBy] = @p5) 
AND ([deletedOn] IS NULL) AND ([deletedBy] IS NULL) AND (NOT ([deleted] = 1))',N'@p0 int,@p1 varchar(8000),@p2 datetime,@p3 int,@p4 
datetime,@p5 int',@p0=103,@p1='UnitTestClient',@p2=''2010-05-17 11:33:22:520'',@p3=3,@p4=''2010-05-17 11:33:22:520'',@p5=3 

मुझे पता नहीं क्यों यह काम नहीं कर रहा है इस प्रकार है ...

चयन वस्तु इस तरह का प्रयोग किया जाता - नए मूल्य के लिए> सेट क्षेत्र -> प्रस्तुत चयनित ऑब्जेक्ट

पैटर्न कई बार और यह समस्या नहीं थी। डीबीएमएल के साथ स्पष्ट रूप से कुछ भी गलत नहीं है - हालांकि यह शायद एक झूठा बयान

कोई विचार है?

यह समस्या यह देखने लगती है कि मुझे वापस ADO.Net पर वापस जाना होगा जो मुझे दुखी करेगा।

उत्तर

1

कुछ बहुत उपयोगी माइक्रोसॉफ्ट लोगों के साथ कुछ चर्चाओं के ठीक बाद मुझे इस समस्या का जवाब मिला है।

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

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

दूसरी ओर समान रूप से फ़ील्ड की बड़ी संख्या में परीक्षण कर सकते हैं - यानी इसका परीक्षण GetHashCode तुलना से अधिक विशिष्ट है।

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

+0

बिल्कुल सही! मैंने सही काम किया था और यह जवाब यहां पाया! धन्यवाद! – Ergodyne

0

यदि यह सटीक अद्यतन स्टेटमेंट डेटाबेस (किसी भी एसईटी तर्क के बिना) को भेजा जाता है, तो आपको LINQ से SQL में एक बग मिला। .NET 4.0 में अपना कोड आज़माएं और यदि यह अभी भी विफल रहता है, तो Microsoft कनेक्ट साइट पर एक बग सबमिट करें।

+0

+1। मैंने यह नहीं बताया कि क्वेरी अमान्य थी। मैं वास्तव में समझ नहीं पाया कि ओपी क्या पूछ रहा था। – Steven

+0

यह .NET 4.0 है ... याद किया गया है कि किशोरों की कमजोर महत्वहीन जानकारी .. मैंने वास्तव में 3.5 कोड से यह कोड लिया है जिसे मैं परिवर्तित कर रहा था ... मैं 99.99% सुनिश्चित हूं कि यह कोड पूरी तरह से ठीक काम करता है। –

+0

हालांकि मैंने तब से ओवरराइड जोड़े, यही कारण है कि यह तोड़ दिया गया है। –

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