2017-05-12 11 views
5

मैं मैं प्रविष्टियाँ एफई 6,1पुनः अनुलग्न संशोधित इकाई

मॉडल

उपयोग कर रहा हूँ, एक उपयोगकर्ता जो अपने आप में एक शहर शामिल हैं। प्रवेश में एक आपूर्तिकर्ता भी है। मैं .AsNoTracking() के साथ मेरी प्रविष्टियों को पुनः प्राप्त:

return dbContext.Set<entry>() 
      .Include(x => x.user.city) 
      .Include(x => x.supplier).AsNoTracking().ToList(); 

मैं और भी अधिक गुण होते हैं लेकिन वे सभी समान हैं।

देखें

उपयोगकर्ता एक प्रविष्टि को देखता है और सभी गुण के सभी सदस्य चर बदल सकते हैं। वह प्रवेश आईडी बदल सकता है (प्राथमिककि नहीं)। वह उपयोगकर्ता का अंतिम नाम बदल सकता है। वह शहर का नाम या ज़िप कोड बदल सकता है।

प्रविष्टि: आईडी = 123

उपयोगकर्ता: first_name = "फू", last_name = "बार"

और इतने पर ...

समस्या

इस उदाहरण के बारे में सोचो

शहर: नाम = "FooCity", zip_code = "4711"

उपयोगकर्ता इसे देखता है। अब वह पहले_नाम को "पीटर" में बदल सकता है और सहेजें पर क्लिक कर सकता है। तो मैं यह कर रहा हूं:

dbContext.Set<entry>().Add(modifiedAndNotTrackedEntry); 
dbContext.Entry(modifiedAndNotTrackedEntry).State = EntityState.Modified; 
dbContext.SaveChanges(); 

लेकिन फिर ईएफ सभी बच्चे entites को डुप्लिकेट करता है। तो डीबी में मेरे पास एक नया उपयोगकर्ता है, जो कि मैं चाहता हूं कि उपयोगकर्ता अभी तक मौजूद न हो। लेकिन यह उपयोगकर्ता पूरी तरह से एक नए शहर को इंगित करता है कि शहर नहीं बदला गया था। इसके अलावा आपूर्तिकर्ता अब डेटाबेस में दो बार मौजूद है।

क्यों AsNoTracking()

मैं AsNoTracking() का इस्तेमाल किया है, क्योंकि उपयोगकर्ता वास्तविक इकाई देखता है। यदि वह कुछ बदलता है तो यह सीधे सभी इकाइयों को प्रभावित करता है: उपयोगकर्ता के रूप में "फू" "बार" वाली सभी प्रविष्टियों को "पीटर" में पहला_नाम सेट करना, फिर उपयोगकर्ता के रूप में "पीटर" "बार" है। लेकिन केवल संशोधित इकाई में यह परिवर्तन होना चाहिए। मुझे लगता है कि ऐसा होता है क्योंकि मैं संदर्भ में "असली" इकाई के सदस्य चर को सीधे संशोधित करता हूं।

प्रश्न

मैं मौजूदा बच्चे संस्थाओं पुनः बनाने के बिना एक संशोधित इकाई कैसे पुनः अनुलग्न कर सकते हैं।

या

मैं प्राप्त कैसे कर सकते हैं जो मैं चाहता AsNoTracking()

+0

हम्म, इसलिए आपकी समस्या मूल रूप से है, कि आपके संशोधित ऑब्जेक्ट के नेविगेशन गुण अज्ञात (अलग) हैं और जब वस्तु सहेजी जाती है, तो उन्हें नई प्रविष्टियों के रूप में माना जाता है। क्या आप अपने डेटा मॉडल में विदेशी कुंजी गुणों का उपयोग करते हैं? – grek40

+0

मैंने दोनों की कोशिश की। फिलहाल मेरे पास विदेशी प्रमुख गुण हैं। – Marv

+0

क्या आप संबंधित संस्थाओं को स्पष्ट रूप से संलग्न कर सकते हैं या इसके लिए जेनेरिक कोड है? मेरा मतलब है 'db.Entry (संशोधित औरNotTrackedEntry)। संदर्भ (x => x.user) .ntityEntry.State = EntityState.Unchanged' या 'db.Entry (संशोधित औरNotTrackedEntry.user) .State = EntityState.Unchanged', अन्य के लिए समान गुण। – grek40

उत्तर

0

मैं के रूप में आप, बहुत अच्छी तरह से अपने reasson ही समझने में यकीन नहीं मैं एक ही बात की कोशिश कर रहा का उपयोग किए बिना, लेकिन शायद इस दस्तावेज़ होगा आपकी मदद।

https://msdn.microsoft.com/en-us/library/jj592676(v=vs.113).aspx

इसके अलावा, लगभग यकीन है कि तुम पर अमल करने की जरूरत है नहीं है मैं।अपने उदाहरण में() जोड़ें, जिसके परिणामस्वरूप अधिकांश मामलों में नए रिकॉर्ड होंगे, या लागू होने पर "अपरिवर्तित" में।

मैं = सिर्फ संलग्न और राज्य लगाने से नए मूल्यों के साथ एक ही इकाई संलग्न करने के लिए संशोधित, अभी भी शोध कैसे फिर से संलग्न से संबंधित गुणों को प्राप्त कर सकते "के अंतर्गत एक अटैच किया जा रहा

चेक (मेरी सबसे खराब समस्या 1TON संबंध है) संदर्भ के लिए मौजूदा इकाई ", शायद यह आपको एक समाधान की ओर ले जाता है।

मैं भी कोड परियोजना में यहाँ कोई रोचक पोस्ट शोध: https://www.codeproject.com/Articles/33088/Reattaching-Entity-Graphs-with-the-Entity-Framewor

ऐसा लगता है इस आदमी को एक विस्तार का आविष्कार इकाई ढांचे पर नोड रेखांकन को पुन: संलग्न है, जैसे "यहाँ आप एफई से सुविधा याद आ रही है । " मै उसे करने की एक कोशिश तो करूंगा।

सम्मान।

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