2010-07-21 13 views
9

मैं इकाई आईडी को जानता हूं जब मैं इकाई का एकमात्र फ़ील्ड अपडेट करना चाहता हूं।LINQ से SQL: संपूर्ण इकाई को पुनर्प्राप्त किए बिना केवल फ़ील्ड को अपडेट करने के लिए

क्या यह पूर्ण इकाई को पुनर्प्राप्त किए बिना LINQ से SQL में संभव है (डेटाकॉन्टेक्स्ट से सभी फ़ील्ड ओवरहेड के साथ)? क्या डेटाकॉन्टेक्स्ट में इकाई बनाना और संलग्न करना संभव है और DataContext.SubmitChanges (या ऐसा कुछ) पर सिंक्रनाइज़ करने के लिए सटीक फ़ील्ड को चिह्नित करना संभव है?

अग्रिम धन्यवाद!

उत्तर

8

हाँ आप कर सकते हैं:

Foo foo=new Foo { FooId=fooId }; // create obj and set keys 
context.Foos.Attach(foo); 
foo.Name="test"; 
context.SubmitChanges(); 

में अपने dbml = "कभी नहीं" सभी गुण के लिए UpdateCheck निर्धारित किया है।

यह एक चयन के बिना एक एकल अद्यतन कथन उत्पन्न करेगा।

एक चेतावनी:

Foo foo=new Foo { FooId=fooId, Name="###" }; 
... 
foo.Name=null; 

आप के लिए जाँच करना चाहते हैं: आप का नाम स्थापित करने के लिए शून्य पर आप एक अलग मूल्य के लिए अपनी foo वस्तु प्रारंभ करने में इतना Linq परिवर्तन का पता लगा सकते होता सक्षम होना चाहते हैं, तो अपडेट करने के दौरान एक टाइमस्टैम्प भी यह कर सकता है:

Foo foo=new Foo { FooId=fooId, Modified=... }; 
// Modified needs to be set to UpdateCheck="Always" in the dbml 
+0

दिलचस्प लगता है। मैं इसे कुछ दिनों में कोशिश करूंगा! –

+1

आह हां, समान दृष्टिकोण ईएफ में काम करता है। हालांकि मुझे EntityKey संपत्ति के साथ ही प्राथमिक कुंजी संपत्ति के लिए मूल्य उत्पन्न करना है। –

1

तुम हमेशा एक मानक T-SQL कथन बना सकते हैं और निष्पादित कि आपके डेटा की दुकान के खिलाफ कर सकते हैं:

YourDataContext 
    .ExecuteCommand("UPDATE dbo.YourTable SET ThatField = newValue WHERE ID = 777", null); 

साथ Linq करने वाली एसक्यूएल ही है, यदि आप ऐसा नहीं कर सकते हैं - यह बुनियादी है इस धारणा है कि यह हमेशा संचालित है वस्तु पर, पूरी वस्तु, और वस्तु के अलावा कुछ भी नहीं।

यदि आपको नियमित आधार पर ऐसा करने की ज़रूरत है, तो एक तरीका इसे संग्रहीत प्रो में लपेटना होगा और उस डेटा को आपके डेटा संदर्भ में उस विधि के रूप में जोड़ना होगा जिसे आप डेटा संदर्भ पर कॉल कर सकते हैं।

+0

ओएमजी, यह एक दयालुता है। ईएफ में स्थिति बदल गई है? क्या आप व्यक्तिगत रूप से ऐसे मामलों के लिए मॉडल में एम्बेडेड एम्बेडेड टी-एसक्यूएल ऑपरेटरों या संग्रहीत प्रक्रियाओं पर भरोसा करेंगे? –

+0

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

+0

ईएफ में हम इन-मेमोरी इकाई बना सकते हैं, EntityKey property + प्राथमिक कुंजी प्रॉपर्टी शुरू कर सकते हैं, फिर संलग्न करें, फिर उन गुणों को बदलें जिन्हें हम अपडेट करना चाहते हैं। SaveChanges अपडेट के लिए काम करता है। –

1

आप ऑब्जेक्ट को रीफ्रेश कर सकते हैं। इस उदाहरण व्यक्ति का पहला नाम बदल जाएगा:

Person person = _entities.Persons.FirstOrDefault(p => p.Id == id); 
person.FirstName = "Bill"; 
_entities.Refresh(System.Data.Objects.RefreshMode.ClientWins, person); 
_entities.SaveChanges(); 
+1

धन्यवाद, @ जीनोम। लेकिन क्या इकाई को पुनर्प्राप्त किए बिना फ़ील्ड अपडेट करना संभव है? –

+0

;-) मैं आपकी पोस्ट को फिर से पढ़ रहा था। जहां तक ​​मुझे पता है कि आपको इकाई की आवश्यकता होगी। लेकिन यह समाधान उस पुराने स्कूल-एसक्यूएल से बचाता है। – gnome

+1

हां, यह "पुराने स्कूल" एसक्यूएल से बचाता है - लेकिन इसे पहले पूर्ण इकाई को पुनर्प्राप्त करने की आवश्यकता होगी, और फिर पूर्ण इकाई को वापस सहेज लेगा। "पुराना स्कूल" एसक्यूएल बहुत आसानी से हो सकता है ..... –

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