【问题标题】:DeleteObject from Entity Framework loads the whole table?实体框架中的 DeleteObject 加载整个表?
【发布时间】:2011-10-06 15:45:05
【问题描述】:

我遇到了实体框架的问题。我的代码尝试从表中删除 1 个或多个对象,其中大多数对象少于 10 个。

foreach (var val in vals)
{
   int id = Convert.ToInt32(val);
   var item = _container.Users.First(x => x.Id == id);
   _container.Subscribers.DeleteObject(item);
}

_container.SaveChanges();

当前表“用户”有大约 20 000 行。当我运行代码时,如果它只尝试删除一个实体,大约需要 10 秒。我调试了代码并查看了 SQL Profiler。在我们点击 DeleteObject() 方法之前,一切都运行顺利。它将这个 sql 查询发送到数据库:

exec sp_executesql N'SELECT 
-- Yada
FROM [dbo].[Users] AS [Extent1]
WHERE [Extent1].[UserListId] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=1

为什么实体框架会加载列表中的所有实体?斯特兰奇!

编辑:

当我将代码更改为:

int id = Convert.ToInt32(val);

Users u = new Users();
u.Id = Convert.ToInt32(val);

_container.Users.Attach(s);
_container.Users.DeleteObject(s);

它就像一个魅力!仍然。 “_container.Users.First(x => x.Id == id)”之前的代码确实去数据库找到了这个对象,但是之后加载了整个表。

【问题讨论】:

  • UserListId 是否已编入索引?不知道是不是这个问题...
  • “加载列表中的所有实体”是什么意思?它只在那里选择一个用户,确定吗?
  • 什么是UserListId,为什么要从Users集合中加载User并从Subscribers集合中删除?

标签: c# sql database entity-framework-4 entity


【解决方案1】:

以下语句无论如何都会调用您的数据库,这并不奇怪,而是 EF 的功能。 如果您在数据库中的用户表上创建了正确的主键,理想情况下它不会花费更多时间。看来你少了PK。

var item = _container.Users.First(x => x.Id == id);

【讨论】:

    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多