2011-10-21 53 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; } 
} 

最初的創建工作正常,但更新只提交更改字符串..

如果我改變子對象,例如在JobType財產JobTypeAJobTypeB - T的他改變不承諾...

我不想提交對JobType的更改 - 只對作業。

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

看看SQL事件探查器 - 這些Ids甚至沒有被髮送用於更新 - 但是它們用於初始插入!

回答

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

這是,如果你暴露的外鍵爲您模特屬性這是越來越簡單多了一個典型的情況:在您的Job實體與JobTypeId您的代碼將工作,因爲FK屬性是標量,狀態設置爲Modified還將將此屬性標記爲已修改。

+0

「這是一個典型的情況,如果您在您的模型中公開外鍵作爲屬性,這種情況會變得更加簡單」 這個。這應該包含在每個EF教程中。它如何讓事情「正常工作」是不可置信的。 –

+0

@EugenTimm更新分離時如何工作?你是否更新導航屬性或FK? –