2013-07-09 186 views
0

我無法對應的代碼先用實體框架模型的問題,這是我的模型的短版:在EF代碼更新收藏首先

public class Project 
{ 
    public int ProjectId { get; set; } 
    public string Name { get; set; } 
    public virtual ProjectPolicies Policies { get; set; } 
    public int ProjectPoliciesId { get; set; } 
} 

public class ProjectPolicies 
{ 
    public int ProjectPoliciesId { get; set; } 
    public DemographicInformation DemographicInformation { get; set; } 
    public int DemographicInformationId { get; set; } 
} 

public class DemographicInformation 
{ 
    public int DemographicInformationId { get; set; } 
    public virtual List<DemographicItem> Items { get; set; } 
} 

public class DemographicItem 
{ 
    public int DemographicItemId { get; set; } 
    public string Key { get; set; } 
    public DemographicValueType Type { get; set; } 
    public string Value { get; set; } 
    public DemographicInformation DemographicInformation { get; set; } 
} 

當我嘗試添加一個新的DemographicItem:

var project = this.myDbContext.Projects.Where(p => p.ProjectId.Equals(id)).First(); 

project.ProjectPolicies.DemographicInformation.DemographicItems.Add(item); 
this.myRepository.Entry<Project>(project); 
this.myDbContext.SaveChanges(); 

它不起作用,因爲它創建一個新的行到數據庫表DemographicInformations而不是更新現有的;我試圖將導航屬性添加到不同的實體級別,但它又不起作用。有沒有辦法從Project Entity映射這個DemographicItem集合?

更新:感謝Gert Arnold但它沒有工作,在向DemographicItems中添加一個新項目後,通訊員表中填入新行和新ID。但是這個新條目有空項目。

+0

嗨,這只是現在,我碰巧看到你的更新。最好將這些評論添加到答案中,因爲答案者會收到通知。 –

回答

0

您應該加載DemographicInformation及其Item小號

var project = this.myDbContext.Projects 
       .Include(p=>p.Policies.Select(x=>x.DemographicInformation.Items)) 
       .Where(p => p.ProjectId.Equals(id)).First(); 

因爲ProjectPolicies.DemographicInformation不懶加載(這不是virtual)。因此EF不會將其視爲現有對象。

或者您必須添加virtual修飾符才能進行延遲加載(而不是在Frist()之後會觸發第二個查詢)。

+0

非常感謝Gert Arnold,但它沒有起作用,在向DemographicItems中添加一個新項目後,對應表中的數據庫充滿了新行和新Id。但是這個新條目有空項目。 – TommyGarcia