将Code First
与EF 5.0
一起使用我有以下内容:
internal class Entities : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Project> Projects { get; set; }
}
// User class which holds a list of 'Project' class
public class User
{
private List<Project> _projects = new List<Project>();
public int Id { get; set; }
internal List<Project> Projects
{
get { return _projects; }
set { _projects = value; }
}
}
// Project class which holds a list of 'Milestone' class
public class Project
{
private List<Milestone> _milestones = new List<Milestone>();
public int Id { get; set; }
public string Title { get; set; }
internal List<Milestone> MileStones
{
get { return _milestones; }
set { _milestones = value; }
}
}
虽然EF已正确创建表和关系(一对多为:User =&gt; Project =&gt; Milestone)如果我创建一个包含某些项目的用户并将其添加到DbContext
,则只有用户将被添加到他的项目不会。对于具有里程碑的项目的用户也是如此。我是这样做的:
public void AddUser(User user)
{
using (var repository = new Entities())
{
repository.Users.Add(user);
repository.SaveChanges();
}
}
我的问题是如何强制EF
自动插入或更新复杂实体(级联),从而为用户添加项目列表,自动将用户插入USERS表,将项目插入PROJECTS表中(带有正确的关系)?
EF
在第5版中是否聪明,或者我应该手动完成?
答案 0 :(得分:3)
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>().HasMany(x => x.Projects);
}
答案 1 :(得分:0)
不用担心,EF足够聪明,但当访问权限设置为internal
时,它无法添加导航属性。让他们public
,你的项目/里程碑将被添加。
// User class
public List<Project> Projects
{
get { return _projects; }
set { _projects = value; }
}
// Project class
public List<Milestone> MileStones
{
get { return _milestones; }
set { _milestones = value; }
}
此外,如果您想在导航属性上启用延迟加载,您还需要使它们public virtual
,因为EF内部必须为您的模型类创建代理。
答案 2 :(得分:0)
您还可以通过将“受保护的内部”设置为“列出项目”和“列出MileStones”属性来获得所需的结果。通过这种方式,EF可以处理它们。 EF'将使用代理类包装器覆盖这些属性,并且您还将具有延迟加载功能。