2012-07-02 20 views
7

एएसपीनेट 4 का उपयोग करते हुए सी #।LINQ से SQL - रिकॉर्ड अपडेट करना

मेरे डेटा एक्सेस लेयर में मेरे पास रिकॉर्ड सहेजने और अपडेट करने के तरीके हैं। बचत करना काफी आसान है लेकिन अद्यतन कठिन है।

मैंने पहले सबसोनिक का उपयोग किया था, क्योंकि यह सक्रिय रिकॉर्ड था और मुझे पता था कि अगर मैंने एक रिकॉर्ड लोड किया है, तो कुछ प्रविष्टियों को बदल दिया है और फिर इसे फिर से सहेजा है, इसे एक अपडेट के रूप में पहचाना गया और उसने एक नया सहेजने की कोशिश नहीं की डीबी में प्रवेश

मुझे नहीं पता कि LINQ में एक ही चीज़ कैसे करें। एक परिणाम के रूप में मेरे कार्यप्रवाह इस तरह है: डीबी

  • उस में कुछ मान उपयोगकर्ता द्वारा बदला जाता है से

    1. वेब पेज पकड़ लेता है 'रिकार्ड ए'।
    2. 'रिकार्ड ए' वापस डेटा का उपयोग परत
    3. मैं अब फिर से रिकॉर्ड एक लोड करने के लिए की जरूरत को पारित कर दिया है, यह 'SavedRecord ए' बुला, पारित कर दिया 'रिकार्ड ए' से मूल्यों के साथ इस वस्तु में सभी मूल्यों को अद्यतन और फिर 'सहेजे गए रिकॉर्ड ए' को अपडेट/सेव करें!

    यदि मैं सिर्फ 'रिकॉर्ड ए' को सहेजता हूं तो मैं डीबी में एक नई प्रविष्टि के साथ समाप्त होता हूं।

    जाहिर है यह अच्छे हो बस रिकार्ड एक गुजरती हैं और तरह कुछ करने के लिए होगा:

    RecordA.Update(); 
    

    मैं वहाँ कुछ मैं यहाँ याद कर रहा हूँ, लेकिन मैं ऑन लाइन एक सीधा उत्तर नहीं मिलता है यह मानते हुए हूँ।

  • उत्तर

    1

    जब LINQ-to-SQL डेटाबेस में एक रिकॉर्ड अद्यतन करता है, इसे केवल यह जानने की आवश्यकता है कि केवल उनको अपडेट करने के लिए फ़ील्ड बदले गए थे।

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

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

    +0

    धन्यवाद, यह आश्चर्य की बात है कि ऐसा करने का कोई अच्छा तरीका नहीं है। मैं LINQ से SQL का उपयोग शुरू करने के बाद से 'दो डीबी कॉल' विधि कर रहा हूं लेकिन मुझे हमेशा एक परेशानी महसूस हो रही है कि मुझे एक स्पष्ट रूप से आसान जवाब याद आ रहा था। ऐसा लगता है कि मेरे पास नहीं है, जो कि दोनों अच्छे और बुरे हैं। –

    2

    आप क्या आप Table उदाहरण पर Attach method का उपयोग कर करते हैं, और DataContext पर SubmitChanges() विधि के माध्यम से करने से पूरा कर सकते हैं।

    यह प्रक्रिया जितनी चाहें उतनी सीधी-आगे नहीं हो सकती है, लेकिन आप गहराई से स्पष्टीकरण/ट्यूटोरियल में डेविड डेविंटर के LINQ to SQL: Updating Entities को और अधिक पढ़ सकते हैं।

    +0

    धन्यवाद, यह जांच लेंगे। –

    1

    मान लें कि आपके पास उत्पाद श्रेणी या डीबी है, तो आपको यह करना होगा।

    DbContext _db = new DbContext(); 
    
        var _product = (from p in _db.Products 
                where p.Id == 1 // suppose you getting the first product 
                select p).First(); // this will fetch the first record. 
    
        _product.ProductName = "New Product"; 
    
        _db.SaveChanges(); 
    
         // this is for EF LINQ to Objects 
        _db.Entry(_product).State = EntityState.Modified; 
        _db.SaveChanges(); 
    
    ------------------------------------------------------------------------------------- 
    this is another example using Attach 
    ------------------------------------------------------------------------------------- 
    
    public static void Update(IEnumerable<Sample> samples , DataClassesDataContext db) 
    { 
        db.Samples.AttachAll(samples); 
        db.Refresh(RefreshMode.KeepCurrentValues, samples) 
        db.SubmitChanges(); 
    } 
    

    आप (चयनित KeepCurrentValues ​​के साथ) संदर्भ के लिए अपने संस्थाओं देते हैं और फिर ताज़ा करें, तो LINQ एसक्यूएल को उन संस्थाओं सर्वर से, मिल उनकी तुलना, और प्रतीक होगा अद्यतन उन है कि अलग हैं

    +0

    धन्यवाद, मेरे मामले में हालांकि मुझे वास्तव में पता नहीं चलेगा कि फ़ील्ड बदल गए हैं क्योंकि उपयोगकर्ता संपादन कर रहा है। इस प्रकार मुझे लगता है कि सभी फ़ील्ड बदल गए हैं और तदनुसार अद्यतन लिखना है। यह थकाऊ है लेकिन कम से कम मुझे पता है कि मैं इसे 'उचित' तरीके से कर रहा हूं, भले ही ऐसा लगता है। –

    +0

    इससे कोई फ़र्क नहीं पड़ता कि उपयोगकर्ता द्वारा कौन से फ़ील्ड संपादित किए गए हैं, जब तक आप HTTPPOST विधि में अपने नियंत्रक में ActionResult को मॉडल पास करते हैं और SaveChanges() को कॉल करते हैं, तो पूरे रिकॉर्ड डीबी में अपडेट हो जाते हैं। –

    +0

    तो, क्या यह काम करना संभव है जहां क्लाइंट ने केवल एक ही बदले गए मूल्य को वापस कर दिया हो + एक महत्वपूर्ण संदर्भ फ़ील्ड? मान लें कि आप उन्हें एक क्रमबद्ध रिकॉर्ड पास करते हैं और वे केवल दो फ़ील्ड वाले एक अद्यतन क्रमबद्ध रिकॉर्ड को पास करते हैं। अभी तक मेरे परीक्षणों में LinqToSql ने मौजूदा डेटा को नल के साथ ओवरराइट करने का प्रयास किया है। जाहिर है इसका मतलब है कि आप स्पष्ट रूप से एक शून्य क्षेत्र को स्पष्ट रूप से कम करने में सक्षम नहीं होंगे। इस क्षेत्र के बहुत सारे = thatfield लिखने से बचने की कोशिश कर रहा है। – RoboJ1M