首先在EF代码中更新集合

时间:2013-07-09 03:27:24

标签: entity-framework ef-code-first

我有一个问题,即按代码优先将模型与实体框架映射,这是我的模型的简短版本:

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。但是这个新条目有空项目。

1 个答案:

答案 0 :(得分:0)

您应该加载DemographicInformation及其Item s

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()之后触发第二个查询)。