2012-11-15 20 views
8

मान लीजिए मैं एक इकाई की रूपरेखा कोड-प्रथम सेटअप में निम्नलिखित मॉडल कक्षाएं:अद्यतन कर रहा है काट दिया संस्थाओं

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Team> Teams { get; set; } 
} 

public class Team 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<Person> People { get; set; } 
} 

डेटाबेस इस कोड से बनाए गए एक TeamPersons तालिका, कई का प्रतिनिधित्व शामिल लोगों और टीमों के बीच कई रिश्ते।

अब मान लीजिए कि मेरे पास एक डिस्कनेक्ट किया गया व्यक्ति ऑब्जेक्ट है (प्रॉक्सी नहीं है, और अभी तक किसी संदर्भ से जुड़ा हुआ नहीं है) जिसका टीम संग्रह में एक या अधिक डिस्कनेक्ट की गई टीम ऑब्जेक्ट्स हैं, जिनमें से सभी डेटाबेस में पहले से ही टीम का प्रतिनिधित्व करते हैं। एक वस्तु के रूप में, बस उदाहरण के लिए, निम्नलिखित द्वारा बनाई जाएगी ईद 1 के साथ एक व्यक्ति और ईद 3 के साथ एक टीम पहले से ही DB में ही अस्तित्व में:

var person = new Person 
{ 
    Id = 1, 
    Name = "Bob", 
    Teams = new HashSet<Team> 
    { 
     new Team { Id = 3, Name = "C Team"} 
    } 
}; 

क्या इस वस्तु को अद्यतन करने का सबसे अच्छा तरीका है, ताकि अपडेट के बाद टीमपर्सन टेबल में बॉब के लिए एक पंक्ति हो, उसे सी टीम से जोड़ना? मैंने स्पष्ट कोशिश की है:

using (var context = new TestContext()) 
{ 
    context.Entry(person).State = EntityState.Modified; 
    context.SaveChanges(); 
} 

लेकिन टीम संग्रह को केवल इस पर नजरअंदाज कर दिया गया है। मैंने कई अन्य चीजों की भी कोशिश की है, लेकिन ऐसा कुछ भी नहीं लगता है जो मैं यहां हूं। किसी भी मदद के लिए धन्यवाद।

संपादित करें:

using (var context = new TestContext()) 
{ 
    var dbPerson = context.People.Find(person.Id); 
    dbPerson.Name = person.Name; 
    dbPerson.Teams.Clear(); 
    foreach (var id in person.Teams.Select(x => x.Id)) 
    { 
     var team = context.Teams.Find(id); 
     dbPerson.Teams.Add(team); 
    } 

    context.SaveChanges(); 
} 

यह एक दर्द है:

तो मुझे लगता है कि मैं, दोनों व्यक्ति और डाटाबेस से टीम [s] लाने सकता है तो उन्हें अपडेट करने और फिर परिवर्तन के लिए प्रतिबद्ध मिल अगर व्यक्ति एक जटिल इकाई है, यद्यपि। मुझे पता है कि मैं चीजों को थोड़ा आसान बनाने के लिए ऑटोमैपर या कुछ का उपयोग कर सकता हूं, लेकिन फिर भी यह शर्म की बात है कि मूल व्यक्ति ऑब्जेक्ट को सहेजने का कोई तरीका नहीं है, बल्कि एक नया प्राप्त करने और सभी संपत्तियों की प्रतिलिपि बनाने के बजाय ...

उत्तर

1

सामान्य दृष्टिकोण डेटाबेस से Team और Add को Person के Teams संग्रह में लाने के लिए है। EntityState.Modified सेट करना केवल स्केलर गुणों को प्रभावित करता है, न कि नेविगेशन गुण।

+0

खरीदें ही है, यह प्रतीत नहीं होता काम करना है करते हैं: एक व्यक्ति के लिए एक टीम डाटाबेस से लाई गई यह भी कहा कि प्रॉक्सी नहीं है अभी भी TeamPersons तालिका में कोई अपडेट नहीं है। काम टीम और व्यक्ति दोनों को डीबी से ला रहा है (इसलिए व्यक्ति एक प्रॉक्सी है), लेकिन फिर आपको सहेजे गए व्यक्ति से मेल खाने के लिए इस प्राप्त व्यक्ति को अपडेट करना होगा ... – Duncan

+1

आह, आप सही हैं (चाहिए बेहतर पढ़ा है)। आपके संपादन के बाद: आप 'DbContext.Entry (dbPerson) का उपयोग कर सकते हैं। CurrentValues.SetValues ​​(व्यक्ति)'। –

+0

धन्यवाद, यह उपयोगी है - मुझे CurrentValues.SetValues ​​ – Duncan

0

पहले मौजूदा इकाइयों का चयन करने का प्रयास करें, फिर टीम ऑब्जेक्ट के टीम संग्रह में टीम को संलग्न करें।

कुछ इस तरह: (सिंटेक्स बिल्कुल सही नहीं हो सकता है)

using (var context = new TestContext()) 
{ 
    var person = context.Persons.Where(f => f.Id == 1).FirstOrDefault(); 
    var team = context.Teams.Where(f => f.Id == 3).FirstOrDefault(); 

    person.Teams.Add(team); 

    context.Entry(person).State = EntityState.Modified; 
    context.SaveChanges(); 
} 
+0

धन्यवाद के बारे में पता नहीं था, लेकिन फिर मुझे इस नए व्यक्ति को मूल से अपडेट करना होगा जिसे मैं सहेजना चाहता था (मेरा संपादन देखें) - मुझे उम्मीद थी कि वहां होगा दूसरा रास्ता। – Duncan

+0

ठीक है, तो आप कह रहे हैं कि डिस्कनेक्ट किए गए व्यक्ति ऑब्जेक्ट में कई बदलाव हैं? – EkoostikMartin

+0

संभावित रूप से, हां: मैं डिस्कनेक्ट किए गए व्यक्ति ऑब्जेक्ट से डीबी को अपडेट करने का सबसे अच्छा तरीका जानना चाहता हूं, जब यह ज्ञात नहीं होता कि उस ऑब्जेक्ट की कौन सी संपत्तियां बदली गई हैं। – Duncan

0

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

0

आप अटैच विधि का उपयोग कर सकते हैं।इस प्रयास करें:

using (var context = new TestContext()) 
{ 
    context.People.Attach(person); 

    //i'm not sure if this foreach is necessary, you can try without it to see if it works 
    foreach (var team in person.Teams) 
    { 
     context.Teams.Attach(team); 
    } 

    context.Entry(person).State = EntityState.Modified; 

    context.SaveChanges(); 
} 

मैं इस कोड का परीक्षण नहीं किया है, मुझे पता है अगर आप किसी भी समस्या

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