【发布时间】: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