2

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=>Project=>Milestone),但如果我创建一个包含一些项目的用户并将其添加到DbContext,则只有该用户将被添加,而他的项目不会. 对于具有里程碑的项目的用户也是如此。我是这样做的:

public void AddUser(User user)
{
    using (var repository = new Entities())
    {
        repository.Users.Add(user);
        repository.SaveChanges();
    }
}

我的问题是如何强制EF自动插入或更新复杂实体(级联),从而添加具有项目列表的用户,在 USERS 表中自动插入用户,在 PROJECTS 表中自动插入他的项目(具有正确的关系)?

在它的第 5 个版本中是EF聪明的还是我应该手动做?

4

3 回答 3

3
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<User>().HasMany(x => x.Projects);
}
于 2013-05-16T18:15:49.347 回答
2

您还可以通过设置“受保护的内部”您的“列出项目”和“列出里程碑”属性来实现所需的结果。这样 EF 就可以处理它们。EF 将使用代理类包装器覆盖这些属性,并且您还将拥有延迟加载功能。

于 2014-07-01T13:15:25.880 回答
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 在内部必须为您的模型类制作代理。

于 2013-05-16T00:20:51.270 回答