2

这个问题是以下问题的延续:

EntityFramework 将新对象添加到集合中

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

但是,如果我有类似以下代码的内容怎么办:

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对象向角色ICollection集合添加新对象,而是使用集合向特定用户添加新角色

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

EntityFramewrk 是否必须将所有用户角色加载到内存中才能执行插入?

4

2 回答 2

1

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

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

于 2012-12-13T20:47:04.050 回答
1

不需要。EF 不需要知道用户拥有什么“角色”。您需要了解变更跟踪会发生什么:

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

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

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

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

EF 会盲目地将“添加”发送到数据库。

于 2013-01-10T04:28:40.617 回答