我遇到了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)”之前的代码确实进入数据库找到这个对象,但之后加载了整个表。
答案 0 :(得分:0)
下面的语句总是调用你的数据库,它不是一个奇怪的但是EF的功能。 如果在数据库中的用户表上创建了正确的主键,理想情况下不会花费更多时间。看来你错过了PK。
var item = _container.Users.First(x => x.Id == id);