EntityFramework 6.0 每行生成一个 DELETE

Posted

技术标签:

【中文标题】EntityFramework 6.0 每行生成一个 DELETE【英文标题】:EntityFramework 6.0 generating one DELETE per row 【发布时间】:2016-07-17 01:30:30 【问题描述】:

我在聚集索引上删除表中大约 5000 行,而 EF 需要将近 30 秒才能完成。

记录生成的 SQL 表明它正在对每一行进行一次删除:

DELETE [dbo].[Table]
WHERE ([ColumnID] = @0)

所以总共有 5000 笔交易。

我尝试过批量调用 SaveChanges(),但这似乎并没有显着提高性能,也没有改变上述行为。

//loop

    //get batch
    db.Table.RemoveRange(batch);
    db.SaveChanges();

我查看了其他一些问题,这些问题指出了每行执行的删除命令的缺陷,但之后没有提出任何建议: How do I delete multiple rows in Entity Framework (without foreach)

有没有办法阻止 EF 每行执行一个命令?如果可能,我想避免使用内联 SQL。

【问题讨论】:

【参考方案1】:

不幸的是,这是RemoveRange 方法的正常行为。您可以在post 中查看答案以获取更多详细信息(查看引用的文本)。

一个选项可能是使用EntityFramework Extended Library nuget 包,它允许您创建一个批处理以在一次往返中删除行:

 //delete all rows where FirstName matches
 db.Table
.Where(u => u.FirstName == "firstname")// just an example
.Delete();

如果您不想使用其他 3rd 方库,您始终可以选择执行原始 sql 语句:

db.ExecuteStoreCommand("DELETE FROM Table WHERE FirstName = 0", firstname);

但我认为您正在追求第一个解决方案;)。

【讨论】:

我听说过一些关于 EntityFramework 扩展库的负面反馈,但我试了一下,它明显更快。至少在我的情况下 - 这是一个伟大的呐喊!

以上是关于EntityFramework 6.0 每行生成一个 DELETE的主要内容,如果未能解决你的问题,请参考以下文章

使用EntityFramework6.1的DbCommandInterceptor拦截生成的SQL语句

EntityFramework 更新 6.0 到 6.1.3 后仍然没有异步方法?

实体框架 6.0 和 oracle 11

Entity Framework 6.0 Raw Sql 查看模型

MiniProfiler 与 EntityFramework 6 代码优先

如何从 NuGet 安装 EntityFramework 5.0(和其他旧版本)?