【问题标题】:Remove/adding from virtual collections memory usage从虚拟集合内存使用中删除/添加
【发布时间】:2015-05-15 17:01:14
【问题描述】:

据我在分析 sql 时所知道的,当它调用 group.Users.Remove(user) 时,它会执行一条 sql 语句来检索该组的所有用户。用户是组上的虚拟集合,首先使用 Entity Framework 6 代码。

var usersToRemove = Context.users.Where(u=>someListOfIds.Contains(u.Id)); //might only be a few users

foreach(var group in Context.groups)
{
    foreach(var user in usersToRemove.Where(u=>u.groupId == group.Id)){
        group.Users.Remove(user);//group.Users might have millions of users, do all users get pulled back into memory at this point?
    }
}

我的问题是,当从group.Users.Remove(user)group.Users.Remove(user) 的集合中删除和项目时,是否所有组用户都被加载到内存中?

【问题讨论】:

  • You 语句Context.groups.where... 导致IQueryable 在您开始循环groupsToRemove 时得到解决此外,除非您处理数百万用户,否则解决整个查询不会让您陷入内存问题(并且会比在您遍历集合时解决每个问题稍快)。
  • 这目前作为一个hangfire作业运行,异步。速度不像内存限制那么严重。将会有大量用户,数百万,这绝对是一个问题。你是说一旦你开始迭代组,所有的组都会被加载到内存中?
  • 修改了评论,让所有用户都被拉回记忆——这可能会让一些人感到困惑
  • 我认为不是。它只是通过主键删除用户。但是您可以轻松调试它。 :)
  • 调试有时会强制它将所有项目加载到内存中,所以我不能确定它在不处于调试模式时的行为方式是否相同。

标签: c# ef-code-first out-of-memory entity-framework-6


【解决方案1】:

当从这里的集合中删除和项目时,是否所有 users.Groups 都被加载到内存中 user.Groups.Remove(group)?

是的,我认为调用group.Users 加载所有用户。调用context.Users(或context.Groups)将返回IQueryable(因为UsersGroupsDbSets),而groups.Users可能是ICollection<User>。所以(假设你启用了延迟加载等)当你访问它时它会被填充。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    • 2013-10-21
    相关资源
    最近更新 更多