这个问题是以下的延续:
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是否必须将所有用户的角色加载到内存中?
答案 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不需要知道用户的“角色”。 您需要了解有关更改跟踪的内容:
运行查询后,更改跟踪器会收到“用户”的对象条目。该用户的状态为“未更改”
您向用户的角色集合添加新角色。这只是为这个新角色添加了一个更改跟踪器条目,并将其标记为“已添加”
在SaveChanges()上,EF将查看您的更改跟踪器并查看用户对象未更改,因此无需执行任何操作。新角色还有一个条目,表明需要添加它。因此,将编写SQL查询以插入此角色。
这很简单。您始终可以为更改跟踪器的状态调试和添加监视。可以通过调用DbContext.ChangeTracker.Entries()找到条目。
EF将盲目地向数据库发送'添加'。