मान लीजिए मैं एक इकाई की रूपरेखा कोड-प्रथम सेटअप में निम्नलिखित मॉडल कक्षाएं:अद्यतन कर रहा है काट दिया संस्थाओं
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] लाने सकता है तो उन्हें अपडेट करने और फिर परिवर्तन के लिए प्रतिबद्ध मिल अगर व्यक्ति एक जटिल इकाई है, यद्यपि। मुझे पता है कि मैं चीजों को थोड़ा आसान बनाने के लिए ऑटोमैपर या कुछ का उपयोग कर सकता हूं, लेकिन फिर भी यह शर्म की बात है कि मूल व्यक्ति ऑब्जेक्ट को सहेजने का कोई तरीका नहीं है, बल्कि एक नया प्राप्त करने और सभी संपत्तियों की प्रतिलिपि बनाने के बजाय ...
खरीदें ही है, यह प्रतीत नहीं होता काम करना है करते हैं: एक व्यक्ति के लिए एक टीम डाटाबेस से लाई गई यह भी कहा कि प्रॉक्सी नहीं है अभी भी TeamPersons तालिका में कोई अपडेट नहीं है। काम टीम और व्यक्ति दोनों को डीबी से ला रहा है (इसलिए व्यक्ति एक प्रॉक्सी है), लेकिन फिर आपको सहेजे गए व्यक्ति से मेल खाने के लिए इस प्राप्त व्यक्ति को अपडेट करना होगा ... – Duncan
आह, आप सही हैं (चाहिए बेहतर पढ़ा है)। आपके संपादन के बाद: आप 'DbContext.Entry (dbPerson) का उपयोग कर सकते हैं। CurrentValues.SetValues (व्यक्ति)'। –
धन्यवाद, यह उपयोगी है - मुझे CurrentValues.SetValues – Duncan