2009-08-12 9 views
13

मैं मान अद्यतन करने की आवश्यकता है, लेकिन मैं यह करने के लिए सभी तालिकाओं मूल्यों पाशन कर रहा हूँ:लिंक-टू-एसक्यूएल के साथ कैसे अपडेट करें?

public static void Update(IEnumerable<Sample> samples 
    , DataClassesDataContext db) 
{ 
    foreach (var sample in db.Samples) 
    { 
     var matches = samples.Where(a => a.Id == sample.Id); 
     if(matches.Any()) 
     { 
      var match = matches.First(); 
      match.SomeColumn = sample.SomeColumn; 
     } 
    } 
    db.SubmitChanges(); 
} 

मैं कुछ ऊपर कोड यह करने के लिए सही रास्ता नहीं है, लेकिन मैं किसी भी के बारे में सोच नहीं सकता था दूसरी तरफ अभी तक। क्या आप एक बेहतर तरीका दिखा सकते हैं?

+0

क्या आप डिस्कनेक्ट की गई संस्थाओं से कनेक्ट की गई इकाइयों को अपडेट करने का प्रयास कर रहे हैं? – Marc

+0

हां, मैं डिस्कनेक्ट की गई इकाइयों से कनेक्ट की गई इकाइयों को अपडेट करने का प्रयास कर रहा हूं –

उत्तर

24

हां, एक आसान तरीका है। बहुत आसान यदि आप अपनी संस्थाओं को संदर्भ में संलग्न करते हैं और फिर रीफ्रेश करें (KeepCurrentValues ​​चयनित के साथ), SQL से लिंक SQL सर्वर से उन इकाइयों को प्राप्त करेगा, उनकी तुलना करें, और अलग-अलग अपडेट किए गए चिह्नित करें। आपका कोड ऐसा कुछ दिखाई देगा।

public static void Update(IEnumerable<Sample> samples 
    , DataClassesDataContext db) 
{ 
    db.Samples.AttachAll(samples); 
    db.Refresh(RefreshMode.KeepCurrentValues, samples) 
    db.SubmitChanges(); 
} 

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

+1

छोटे अर्थपूर्ण सुधार, यह "उन्हें अपडेट नहीं किया गया" है। यह क्या करता है प्रत्येक संपत्ति के "मूल मूल्य" को डेटाबेस से पढ़ने वाले मानों के साथ प्रतिस्थापित करता है। चूंकि प्रत्येक प्रॉपर्टी का "वर्तमान मूल्य" अपरिवर्तित है, इसलिए सबमिट चेंज उन रिकॉर्ड्स को अपडेट करने के बारे में जानेंगे जिनके मूल मूल्य (जिसे सर्वर से पढ़ा गया था) जो मौजूदा मान से अलग है (जिसे विधि में पारित किया गया था)। –

+3

एफवाईआई, यह केवल तभी काम करेगा जब नमूने डेटाबेस में मौजूद होने का सबसेट है। दो मान्यताओं मौजूद हैं। 1. कोई भी इस तालिका से आपके रिकॉर्ड के किसी भी रिकॉर्ड को हटा देगा जो आपके नमूने गणना में मौजूद है। 2. नतीजतन, आपके नमूने संग्रह में आपके द्वारा जोड़े गए कोई भी नई प्रविष्टियां नहीं हो सकती हैं। – Marc

7

Linq2Sql (या लिंक से इकाइयों) के साथ, सर्वर पर रिकॉर्ड्स को पूर्ण रूप से पुनर्प्राप्त किए बिना अपडेट करने का कोई तरीका नहीं है, तो आप वास्तव में सही कर रहे हैं।

यदि आप इससे बचना चाहते हैं, तो एक संग्रहित प्रक्रिया लिखें जो आप चाहते हैं और इसे अपने मॉडल में जोड़ें।

मुझे लगता है कि यदि आपके अभीष्ट प्रश्न तथापि :) था पूरी तरह से यकीन नहीं है

*: वहाँ कि उपयोग LINQ एक SELECT कथन का निर्माण और किसी भी तरह एक अद्यतन में जिसके परिणामस्वरूप SELECT कथन कसाई के आसपास कुछ हैक्स, हैं, लेकिन मैं इसकी सिफारिश नहीं करता।

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