2009-11-18 12 views
15

में है कि पहले से ही साथ एक इकाई जोड़ा नहीं जा सकता इस विशिष्ट कट परिदृश्य पर विचार करें:LINQ संलग्न(): एक महत्वपूर्ण उपयोग

  • लोड एसक्यूएल सर्वर से एक ग्राहक वस्तु LINQ का उपयोग कर SQL के
  • उपयोगकर्ता इकाई को संपादित करता है, और प्रस्तुतिकरण स्तर संशोधित इकाई को वापस भेजता है।
  • डेटा परत, L2S का उपयोग कर, एसक्यूएल सर्वर

में परिवर्तन भेजना होगा SQL क्वेरी जिसका इरादा एक ग्राहक इकाई लेने के लिए है करने के लिए इस LINQ पर विचार करें।

Cust custOrig = db.Custs.SingleOrDefault(o => o.ID == c.ID); //get the original 
db.Custs.Attach(c, custOrig); //we don't have a TimeStamp=True property 
db.SubmitChanges();     

DuplicateKeyException: Cannot add an entity with a key that is already in use.

alt text

प्रश्न

  • कैसे आप इस अपवाद बच सकते हैं?
  • एक ऐसी इकाई को अद्यतन करने के लिए सबसे अच्छी रणनीति क्या है जो टाइमस्टैम्प संपत्ति नहीं है/चाहता/चाहती है?

उप इष्टतम समाधान

  • मैन्युअल मूल ग्राहक के लिए अद्यतन ग्राहक की प्रत्येक प्रॉपर्टी की स्थापना की।
  • स्पिन को एक और DataContext

उत्तर

23

इस तथ्य यह है कि अपने DataContext (डाटाबेस) एक ही इकाई एक बार से अधिक ट्रैक नहीं कर सकते से कोई लेना देना नहीं है। क्या हो रहा है इसके बारे में अधिक जानकारी के लिए this post देखें।

कि पोस्ट के नीचे स्थित अस्पष्ट टिप्पणियों में से एक कोशिश करने के लिए कहते हैं:

public void Update(Customer customer) 
{ 
    NorthwindDataContext context = new NorthwindDataContext(); 
    context.Attach(customer); 
    context.Refresh(RefreshMode.KeepCurrentValues, customer); 
    context.SubmitChanges(); 
} 

मुझे पता है कि यह आप के लिए बाहर काम करता है, के रूप में उस पोस्ट की ओपी कहना है कि वह उसके लिए बाहर काम करते हैं .. ।

+0

+1; धन्यवाद! यह वास्तव में काम किया था! मैं अब इस प्रश्न को 'अनुत्तरित' छोड़ दूंगा, लेकिन यह जवाब निश्चित रूप से समस्या हल करता है! –

+0

जस्टलोरेन कहते हैं कि अटैच एक संदर्भ देने के लिए है जो अभी तक नहीं है - इसका उपयोग किसी को बदलने के लिए नहीं किया जा सकता है। एक सामान्य स्थिति में यदि आप किसी ऑब्जेक्ट को वापस प्राप्त कर रहे हैं तो यह कुछ समय बाद होगा और एक नए डेटा संदर्भ से जुड़ा होगा। – DamienG

-4

इसके बजाय एक नया संदर्भ बनाने की आप ऐसा कर सकता है:

public void Update(Customer customer) 
{ 
    Customer oldCustomer= db.Custs.First(c => c.ID == customer.ID); //retrieve unedited 
    oldCustomer = customer; // set the old customer to the new customer. 
    db.SubmitChanges(); //sumbit to database 
} 
+1

वह डेटाबेस को अपडेट नहीं करेगा, यह केवल वैरिएबल पुराने क्लाइंटर को संदर्भित करेगा। – Haukman

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