Entity Framework中的DeleteObject加载整个表?

时间:2011-10-06 15:45:05

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

我遇到了Entity Framework的问题。我的代码尝试从表中删除大多数小于10的1个或多个对象。

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();

当前表“Users”有大约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

为什么实体框架会加载列表中的所有entite? Straaange!

编辑:

当我将代码更改为:

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)”之前的代码确实进入数据库找到这个对象,但之后加载了整个表。

1 个答案:

答案 0 :(得分:0)

下面的语句总是调用你的数据库,它不是一个奇怪的但是EF的功能。 如果在数据库中的用户表上创建了正确的主键,理想情况下不会花费更多时间。看来你错过了PK。

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