2011-10-21 9 views
8

मैं एक वस्तु है कि मैं पहले से EntityFramework 4.1 (CodeFirst)इकाई की रूपरेखा 4.1 (CodeFirst)

वर्ग नौकरी निम्नलिखित गुण है के साथ सहेजा है अद्यतन करने के लिए कोशिश कर रहा हूँ में एक बच्चे वस्तु के लिए एक संदर्भ अद्यतन कर रहा है ...

public class Job 
{ 
    [key] 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public Project Project { get; set; } 
    public JobType JobType { get; set; } 
    public string Description { get; set; } 
} 

प्रारंभिक काम करता है ठीक बनाने के लिए, लेकिन अद्यतन केवल तार में परिवर्तन करता है ..

अगर मैं बच्चे वस्तुओं को बदलने JobTypeA से JobTypeB को JobType संपत्ति जैसे - टी वह परिवर्तन प्रतिबद्ध नहीं है ...

मैं जॉबटाइप में बदलाव करने की तलाश नहीं कर रहा हूं - केवल नौकरी के लिए।

using (var context = new JobContext()) 
{ 
    context.Jobs.Attach(job); 
    context.Entry(job).State = EntityState.Modified; 
    context.SaveChanges(); 
} 

एसक्यूएल प्रोफाइलर पर एक नज़र होने - आईडी भी अद्यतन के लिए भेजे जा रहे हैं - लेकिन वे प्रारंभिक डालने के लिए कर रहे हैं!

उत्तर

15

राज्य को Modified पर सेट करने से केवल आपके नेविगेशन गुणों को स्केलर और जटिल गुण अपडेट नहीं होते हैं। यह केवल इकाई फ्रेमवर्क के परिवर्तन का पता लगाने के माध्यम से चला जाता है। इसका मतलब है कि आप डेटाबेस से मूल लोड करने के लिए की जरूरत है:

using (var context = new JobContext()) 
{ 
    var originalJob = context.Jobs.Include(j => j.JobType) 
     .Single(j => j.Id == job.Id); 

    // Update scalar/complex properties 
    context.Entry(originalJob).CurrentValues.SetValues(job); 

    // Update reference 
    originalJob.JobType = job.JobType; 

    context.SaveChanges(); 
} 

आप शायद भी कुछ "चाल" आपके मामले में लाभ उठाने सकता है:

using (var context = new JobContext()) 
{ 
    var jobType = job.JobType; 
    job.JobType = null; 

    context.JobTypes.Attach(jobType); 
    context.Jobs.Attach(job); 
    // change detection starts from here, 
    // EF "thinks" now, original is JobType==null 

    job.JobType = jobType; 
    // change detection will recognize this as a change 
    // and send an UPDATE to the DB 

    context.Entry(job).State = EntityState.Modified; // for scalar/complex props 

    context.SaveChanges(); 
} 

हालांकि यह यदि आप चाहते हैं काम नहीं होगा JobType से null पर सेट करें।

यह एक विशिष्ट स्थिति है जिसमें अगर आप अपने मॉडल में गुण के रूप में विदेशी कुंजी का खुलासा बहुत सरल हो रही है है: अपने कोड काम करेगा क्योंकि FK संपत्ति अदिश और यह भी होगा Modified करने के लिए राज्य की स्थापना है अपने Job इकाई में एक JobTypeId के साथ इस संपत्ति को संशोधित के रूप में चिह्नित करें।

+0

"यह एक सामान्य स्थिति है जो आपके मॉडल में गुणों के रूप में विदेशी कुंजी का पर्दाफाश करती है तो बहुत आसान हो रही है" यह। इसे प्रत्येक ईएफ-ट्यूटोरियल में शामिल किया जाना चाहिए। यह अविश्वसनीय है कि यह चीजें कैसे "बस काम करता है" बनाता है। –

+0

@EugenTimm अलग-अलग अपडेट करते समय यह कैसे काम करता है? क्या आप नेविगेशन प्रॉपर्टी, या एफके अपडेट करते हैं? –