我有一个问题,即按代码优先将模型与实体框架映射,这是我的模型的简短版本:
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
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()
之后触发第二个查询)。