2011-08-18 5 views
36

आधिकारिक दस्तावेज एक इकाई को संशोधित करने के लिए कहता है जिसे मैं एक DbEntityEntry ऑब्जेक्ट पुनर्प्राप्त करता हूं और या तो संपत्ति कार्यों के साथ काम करता हूं या मैंने इसे संशोधित करने के लिए सेट किया है। यह निम्नलिखित उदाहरणइकाई फ्रेमवर्क - स्पष्ट रूप से संशोधित करने के लिए इकाई स्थिति क्यों सेट करें?

Department dpt = context.Departments.FirstOrDefault(); 
DbEntityEntry entry = context.Entry(dpt); 
entry.State = EntityState.Modified; 

मुझे दूसरे और तीसरे कथन के उद्देश्य को समझ में नहीं आता है। अगर मैं 1 बयान की तरह एक इकाई के लिए रूपरेखा पूछना है और फिर

dpt.Name = "Blah" 

में के रूप में POCO संशोधित करते हैं मैं तो SaveChanges को एफई() से पूछते हैं, इकाई (मैं संशोधित की एक स्थिति होती है स्नैपशॉट ट्रैकिंग के माध्यम से अनुमान लगाया जा रहा है, यह प्रॉक्सी नहीं है) और राज्य को मैन्युअल रूप से सेट करने की आवश्यकता के बिना परिवर्तन जारी रहे हैं। क्या मुझसे कोई चूक हो रही है?

उत्तर

38

आपके परिदृश्य में आपको वास्तव में राज्य को सेट करने की आवश्यकता नहीं है। यह बदलने के लिए ट्रैकिंग ट्रैकिंग का उद्देश्य है कि आपने संलग्न इकाई पर एक मूल्य बदल दिया है और इसे संशोधित स्थिति में डाल दिया है। अलग-अलग इकाइयों के मामले में राज्य को मैन्युअल रूप से सेट करना महत्वपूर्ण है (परिवर्तन के बिना लोड किए गए इकाइयां या मौजूदा संदर्भ के बाहर बनाई गई इकाइयां)।

+4

पुष्टि करने के लिए धन्यवाद। मेरे द्वारा पढ़े गए कई ट्यूटोरियल इस दृष्टिकोण का उपयोग करने लगते हैं जो भ्रमित है। – SeeNoWeevil

16

जैसा कि कहा गया है, डिस्कनेक्ट की गई संस्थाओं के साथ एक परिदृश्य में यह इकाई की स्थिति को Modified पर सेट करने के लिए उपयोगी हो सकता है। यह डेटाबेस में एक राउंडट्रिप बचाता है यदि आप डिस्कनेक्ट की गई इकाई को अटैचमेंट करते हैं, क्योंकि डेटाबेस से इकाई को लाने और इसे संशोधित करने और सहेजने के विरोध में।

लेकिन राज्य को Modified पर सेट न करने के बहुत अच्छे कारण हो सकते हैं (और मुझे यकीन है कि Ladislav इस बारे में पता था, लेकिन फिर भी मैं उन्हें यहां इंगित करना चाहता हूं)।

  1. रिकॉर्ड में सभी फ़ील्ड अपडेट किए जाएंगे, न केवल परिवर्तन। ऐसे कई सिस्टम हैं जिनमें अपडेट ऑडिट किए जाते हैं। सभी फ़ील्ड को अपडेट करने से या तो बड़ी मात्रा में अव्यवस्था हो सकती है या झूठी बदलावों को फ़िल्टर करने के लिए ऑडिटिंग तंत्र की आवश्यकता होती है।

  2. आशावादी सहमति। चूंकि सभी फ़ील्ड अपडेट किए जाते हैं, इससे आवश्यकतानुसार अधिक संघर्ष हो सकते हैं। यदि दो उपयोगकर्ता एक ही रिकॉर्ड को एक साथ अद्यतन करते हैं लेकिन एक ही फ़ील्ड नहीं हैं, तो एक संघर्ष की आवश्यकता नहीं है। लेकिन अगर वे हमेशा सभी फ़ील्ड अपडेट करते हैं, तो अंतिम उपयोगकर्ता हमेशा स्टाइल डेटा लिखने का प्रयास करेगा। यह सबसे अच्छा एक आशावादी concurrency अपवाद या सबसे खराब मामले डेटा हानि में सबसे अच्छा कारण होगा।

  3. बेकार अपडेट। इकाई को संशोधित के रूप में चिह्नित किया गया है, इससे कोई फर्क नहीं पड़ता। अपरिवर्तित संस्थाएं भी एक अद्यतन आग लग जाएगी। यह आसानी से तब हो सकता है जब विवरण देखने के लिए विंडोज़ को खोला जा सकता है और OK द्वारा बंद किया जा सकता है।

तो यह एक अच्छा संतुलन है। Roundtrips कम या अनावश्यकता को कम करें।

वैसे भी, Modified करने के लिए राज्य की स्थापना करने के लिए वैकल्पिक (DbContext एपीआई का उपयोग) है:

void UpdateDepartment(Department department) 
{ 
    var dpt = context.Departments.Find(department.Id); 
    context.Entry(dpt).CurrentValues.SetValues(department); 
    context.SaveChanges(); 
} 

CurrentValues.SetValuesModified के रूप में अलग-अलग प्रॉपर्टी चिह्नित करता है।

+0

@GertAmold, क्या आप नामस्थान कह सकते हैं जहां 'CurrentValues.SetValues' रहता है। मैं इसे ** एएसपी.नेट कोर 1.0 ** में प्राप्त कर सकता हूं –

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