2013-11-22 7 views
10

के बीच अंतर मेरा लक्ष्य मौजूदा इकाई की प्रतिलिपि बनाना है, इसे थोड़ा संशोधित करना है, और संशोधित संस्करण डालना है।इकाई फ्रेमवर्क: डिटेच और AsNoTracking

var thing = context.Things.Where(x => x.SomeID == someid).AsNoTracking().Single(); 
thing.AnotherID = 1234; 
context.Things.AddObject(thing); 
context.SaveChanges(); 

var thing = context.Things.Where(x => x.SomeID == someid).Single(); 
context.Detach(thing); 
thing.AnotherID = 1234; 
context.Things.AddObject(thing); 
context.SaveChanges(); 

मैं क्या बता सकते हैं कि वे दोनों मेरे लक्ष्य को पूरा कर रहे हैं से:

मैं दो अलग अलग तरीकों कि दोनों काम करने के लिए दिखाई देते हैं की कोशिश की है। अन्य की तुलना में इन बेहतर में से एक है, या वे दोनों समान रूप से ठीक हैं (या गलत !?)

+0

एफवाईआई, चूंकि आपने 'फर्स्टऑर्ड डीफॉल्ट' का उपयोग किया था, 'चीज' 'शून्य 'हो सकती है। 'चीज़' का उपयोग करने से पहले आपको' शून्य 'की जांच करनी होगी। –

+0

@ जॉन सैंडर्स - thx। मैंने इसे सिंगल का उपयोग करने के लिए संपादित किया। – TTT

उत्तर

15

पहले संस्करण बेहतर है और मैं इसे पसंद करेंगे क्योंकि

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

उत्कृष्ट उत्तर। धन्यवाद। – TTT

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