2013-05-22 8 views
8

वहाँ इकाई की रूपरेखा में DbContext 5.एक विस्तार विधि (EF5) के साथ DbContext.Detach() विधि वापस लाओ

पर कोई Detach(object entity) एक इकाई को अलग करने के लिए राज्य अब बदलने की आवश्यकता है। शायद मैं कुछ याद आ रही है, लेकिन यह बहुत कम सहज और Detach विधि का उपयोग कर से पठनीय लगता है:

public static void Detach(this MyEntities context, object entity) 
{ 
    context.Entry(entity).State = EntityState.Detached; 
} 

: बस वापस अलग विधि लाने के लिए एक विस्तार विधि बनाने

context.Entry(myEntity).State = EntityState.Detached; 

मैं कर रहा हूँ करने के लिए परीक्षा माइक्रोसॉफ्ट ने ईएफ 5 में DbContext.Detach() विधि को क्यों हटाया है इसका कारण क्या है?

+1

"मैं केवल एक विस्तार विधि बनाने का लुत्फ उठा रहा हूं" - आप उस कक्षा के लिए एक विस्तार विधि क्यों बनायेंगे जिसका आपके पास पूर्ण नियंत्रण है? आप इसे सीधे 'WIMTENTITY' में जोड़ सकते हैं। – hvd

उत्तर

16

(DbContext) एपीआई से एक Detach विधि को निकालने में कुछ उदाहरण कोड है कुछ तर्क है क्योंकि Detach एक वस्तु ग्राफ पर काम नहीं करता है, लेकिन यह केवल एक वस्तु है कि आप पारित detaches विधि में

  • Attach नेविगेशन गुण की वस्तु ग्राफ
  • Add संदर्भ के लिए सभी संबंधित वस्तुओं सहित आपूर्ति की वस्तु कहते हैं में सभी संबंधित वस्तुओं सहित आपूर्ति की वस्तु देता: यह अन्य सभी तरीकों कि वस्तु स्थिति बदलने में अलग है
  • Remove हटाता संबंधित वस्तुओं है कि व्यापक साथ विन्यस्त किया गया है सहित आपूर्ति की वस्तु को नष्ट

दूसरी ओर की स्थापना पर राज्य को मैन्युअल रूप से Modified, Added या Deleted हमेशा संबंधित वस्तुओं पर नहीं, आपूर्ति की गई वस्तु पर कार्य करता है। यह ObjectContext की Detach विधि को कॉल करने का भी मामला है। अन्य राज्य परिवर्तनों के व्यवहार के अनुरूप होने के लिए राज्य को Detached पर सेट करके केवल ऑब्जेक्ट को अलग करने के लिए अधिक परिणाम है क्योंकि किसी भी अन्य राज्य को सेट करने से यह केवल संबंधित वस्तुओं के बिना आपूर्ति की गई वस्तु को प्रभावित करता है।

DbContext अन्य सुविधाओं के साथ - इकाई फ्रेमवर्क के साथ काम करने के लिए आसान है। पुरानी Detach विधि अधिक भ्रमित थी और इसका व्यवहार कई डेवलपर्स की अपेक्षा नहीं है। (Here और here इस भ्रम और किसी ऑब्जेक्ट को अलग करने में शामिल जटिलताओं के बारे में दो संदर्भ हैं।) मेरी राय में DbContext API से इसे निकालने का गलत कदम नहीं था।

ठीक है, अगर आप वास्तव में Detach विधि चाहते हैं तो आप हमेशा एडाप्टर के माध्यम से अंतर्निहित ObjectContext को अपनी एक्सटेंशन विधि लिख सकते हैं या एक्सेस कर सकते हैं।

5

मुझे पता नहीं है क्यों कोई Detach() विधि लेकिन DbSet वर्ग एक विधि AsNoTracking() वस्तुओं कि DbContext से अलग कर रहे हैं लाने के लिए उजागर करता है।

यहाँ से here

using (var context = new UnicornsContext()) 
{ 
    // Query for all unicorns without tracking them 
    var unicorns1 = context.Unicorns.AsNoTracking(); 

    // Query for some unitcorns without tracking them 
    var unicorns2 = context.Unicorns 
     .Where(u => u.Name.EndsWith("ky")) 
     .AsNoTracking() 
     .ToList(); 
} 
+0

नोटिंग [यह उत्तर] (http://stackoverflow.com/a/5600202/538763) इंगित करता है कि AsNoTracking Detach के बराबर नहीं हो सकता है। – crokusek

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