DeleteObject从实体框架加载整个表

本文关键字:加载 框架 实体 DeleteObject | 更新日期: 2023-09-27 18:10:31

我遇到了一个问题与实体框架。我的代码试图从一个表中删除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();

当前表"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

为什么实体框架加载列表中的所有实体?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."之前的代码。首先(x => x. id == id)"确实去数据库查找这个对象,但是之后加载了整个表

DeleteObject从实体框架加载整个表

下面的语句无论如何都会调用您的数据库,这不是EF的一个奇怪的功能。如果您在数据库的User表上创建了合适的主键,理想情况下不会花费更多的时间。你好像漏掉了PK。

var item = _container.Users。