2009-07-21 10 views
30

मैंने अपने सामान्य एनएचबेरांटे के बजाय एंटीटी फ्रेमवर्क का उपयोग करना शुरू कर दिया है ताकि यह देखने के लिए कि ईएफ कैसे काम करता है और अब तक मुझे बहुत सारी समस्याएं आ रही हैं लेकिन विशेष रूप से कोई ऑब्जेक्ट को अलग कर रहा है और रख रहा है संबंधित बाल वस्तुओं।
मैंने O'Reilly Entity Framework पुस्तक खरीदी है जो आपको बताती है कि "डिफ़ॉल्ट रूप से हाँ इकाई फ्रेमवर्क ऑब्जेक्ट ग्राफ़ को तब तक नहीं रखता है जब आप अलग करते हैं" लेकिन यह दिखाता है कि आप ग्राफ को कैसे बनाए रखें! धन्यवाद O'Reilly वास्तव में उपयोगी है।इकाई फ्रेमवर्क - संबंधित ऑब्जेक्ट ग्राफ़ को अलग करें और रखें

वैसे भी अगर कोई मदद कर सकते हैं बहुत अच्छा होगा, नीचे दिए गए कोड:

 using (var creativeWorkshopEntities = new CreativeWorkshopEntities()) 
     { 
      var q = from c in creativeWorkshopEntities.Job.Include("Files") 
        where c.Id == jobId 
        select c; 

      var job = q.First(); 

      creativeWorkshopEntities.Detach(job); 

      return job; 
     } 

धन्यवाद!

दान

उत्तर

24

बजाय एक NoTracking क्वेरी का उपयोग कर प्रयास करें। इस तरह की वस्तुओं, संलग्न arenever ताकि आप 'अलग' है जो जब ग्राफ कटा जाता है की जरूरत नहीं है:

यानी

using (var creativeWorkshopEntities = new CreativeWorkshopEntities())   
{    
    creativeWorkshopEntities.Job.MergeOption = MergeOption.NoTracking; 
    var q = from c in creativeWorkshopEntities.Job.Include("Files") 
      where c.Id == jobId      
      select c;    
    var job = q.First();    
    return job; 
} 

आशा इस मदद करता है

एलेक्स

(कार्यक्रम प्रबंधक इकाई की रूपरेखा टीम) बाहर

+0

यही है बहुत धन्यवाद एलेक्स MergeOption के लिए चाल किया लेकिन समस्या यह एक अलग बिना है मेरी अद्यतन विधि काम नहीं करता है, वैसे भी इस के आसपास? (var creativeyWorkshopEntities = new CreativeWorkshopEntities()) { यदि (job.Id> 0) creativeWorkshopEntities.AttachUpdated (job) का उपयोग कर; // कस्टम विस्तारक विधि अन्य creativeWorkshopEntities.AddToJob (नौकरी); creativeworkSntitiesEntities.SaveChanges(); } –

+0

आपको अद्यतन इकाई में गुजरने वाले ApplyPropertyChanges (...) का उपयोग करने की आवश्यकता है। ApplyPropertyChanges (अपडेटेड) 'अद्यतन' इकाई से मूल इकाई पर मूल्यों की प्रतिलिपि बनाता है। इसके लिए 'मूल' इकाई को काम करने के लिए संदर्भ में होना चाहिए, या तो क्योंकि आप एक प्रतिलिपि पर हैं और इसे संलग्न (अनुशंसित) या क्योंकि आपने डेटाबेस से इसे फिर से लोड करने के लिए एक क्वेरी की है। –

+6

क्या इकाई ग्राफ को कटाई से रोकने के लिए कोई तरीका है? इस तरह से कार्यान्वित करना क्यों अलग है? – Den

2

चेक http://www.codeproject.com/KB/architecture/attachobjectgraph.aspx

यह एक भयानक समाधान है और आप मदद कर सकते हैं - कि लेखक भी अपने ही ब्लॉग पर एक अद्यतन संस्करण है बारे में पता होना - http://www.codetuning.net/blog/post/Entity-Framework-reattaching-entity-graphs-(3).aspx

पॉल कोड नीचे

+0

से जुड़ा रहता है यह वास्तव में एक महान समाधान की तरह दिखता है! –

0

उपयोग स्मृति में संबंधित वस्तुओं रखने के लिए।

using (var creativeWorkshopEntities = new CreativeWorkshopEntities()) 
    { 
       var q = from c in creativeWorkshopEntities.Job.Include("Files") 
         where c.Id == jobId 
         select c; 

       var job = q.First(); 

       return (Job)Detach(job); 
    } 

    private Object Detach(Object object) 
    { 
      using (var stream = new MemoryStream()) 
      { 
       var formatter = new BinaryFormatter(); 
       formatter.Serialize(stream, dbo); 
       stream.Position = 0; 
       return formatter.Deserialize(stream); 
      } 
    } 
+2

यह केवल एक ही वस्तु को अलग करता है - संपूर्ण ग्राफ नहीं। –

+0

@ डैनीवार्ड आप ऐसा क्यों सोचेंगे? मैंने अभी कोशिश की है और यह उम्मीद के अनुसार काम करता है, सभी संस्थाएं वहां हैं। – veljkoz

+0

@veljkoz ईएफ 4 से अलग किए गए डिटेच ने केवल एक ही वस्तु को अलग किया, यह कार्यान्वयन ऑब्जेक्ट क्लोन करता है। मुझे याद नहीं है कि मैंने ऐसा क्यों लिखा - यह एक साल पहले था और मुझे कोई संपादन नहीं दिख रहा है। –

3

EF5 में MergeOption अब DbSet स्तर पर नहीं है। तो इस के अनुसार: http://msdn.microsoft.com/en-us/data/hh949853.aspx

आप की तरह कुछ करने की आवश्यकता होगी आप एक ट्रैकिंग नहीं क्वेरी क्या करना चाहते हैं:

var q = from c in creativeWorkshopEntities.Job.AsNoTracking().Include("Files") 
         where c.Id == jobId 
         select c; 
संबंधित मुद्दे