EntityFramework 6.0每行生成一个DELETE



我在集群索引上删除了大约5000行表,EF几乎需要30秒。

记录生成的SQL显示它对每行执行一次删除:

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

所以总共有5000笔交易。

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

//loop
{
    //get batch
    db.Table.RemoveRange(batch);
    db.SaveChanges();
}

我已经研究了一些其他问题,这些问题指出了每行执行删除命令的缺陷,但之后没有提出任何建议:如何删除实体框架(没有foreach)中的多行

是否有任何方法可以阻止EF每行执行一个命令?如果可能的话,我希望避免内联SQL。

不幸的是,这是RemoveRange方法的正常行为。你可以在这篇文章中看到答案以了解更多细节(查看引用的文本)。

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

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

如果你不想使用另一个第三方库,你可以选择执行一个原始的sql stamment:

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

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

最新更新