EntityFramework将新对象添加到嵌套对象集合

时间:2012-12-13 20:34:57

标签: c# entity-framework

这个问题是以下的延续:

EntityFramework adding new object to a collection

现在我明白使用DbSet EF时不会将整个集合加载到内存中

但是,如果我有类似下面的代码:

public class User
{
    public int UserID { get; set; }
    public string UserName { get; set; }
    public ICollection<Role> Roles { get; set; }
}

public class Role
{
    public int RoleID { get; set; }
    public string RoleName { get; set; }
    public User User { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Role> Roles { get; set; }
}

public class SomeClass
{
    public void AssignRoleToUser(int userID, Role role)
    {
        var ctx = new MyContext();
        var user = ctx.Users.First(x => x.UserID.Equals(userID));

        user.Roles.Add(role);

        ctx.SaveChanges();
    }
}

在这种情况下,我没有使用DbSet对象向 Role 集合添加新对象,而是使用新的角色向特定用户添加ICollection集合

那么在这种情况下会发生什么?

为了执行插入,EntityFramewrk是否必须将所有用户的角色加载到内存中?

2 个答案:

答案 0 :(得分:1)

在上面提供的代码中,您没有添加新角色,因为您的ctx.Users仅用于检索数据。这篇SE帖子中提到了一些类似的问题 - Linq To Entities - how to filter on child entities

我建议您查看这篇简短实用的文章 - Entity Framework 4.0 FAQ – Getting Started Guide

答案 1 :(得分:1)

没有。 EF不需要知道用户的“角色”。 您需要了解有关更改跟踪的内容:

  1. 运行查询后,更改跟踪器会收到“用户”的对象条目。该用户的状态为“未更改”

  2. 您向用户的角色集合添加新角色。这只是为这个新角色添加了一个更改跟踪器条目,并将其标记为“已添加”

  3. 在SaveChanges()上,EF将查看您的更改跟踪器并查看用户对象未更改,因此无需执行任何操作。新角色还有一个条目,表明需要添加它。因此,将编写SQL查询以插入此角色。

  4. 这很简单。您始终可以为更改跟踪器的状态调试和添加监视。可以通过调用DbContext.ChangeTracker.Entries()找到条目。

    EF将盲目地向数据库发送'添加'。