EntityFramework 6.0每行生成一个DELETE

FBr*_*t87 4 c# entity-framework delete-row

我在聚簇索引上删除了大约5000行我的表,而EF需要将近30秒才能完成.

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

DELETE [dbo].[Table]
WHERE ([ColumnID] = @0)
Run Code Online (Sandbox Code Playgroud)

所以共有5000笔交易.

我已经尝试批量调用SaveChanges(),但这似乎没有提高性能,或改变上述行为.

//loop
{
    //get batch
    db.Table.RemoveRange(batch);
    db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)

我看了一些其他问题,指出了每行执行删除命令的这个缺陷,但之后没有提出建议: 如何在Entity Framework中删除多行(没有foreach)

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

oct*_*ccl 10

不幸的是,这是RemoveRange方法的正常行为.你可以看到这个答案了解更多详情(查看引用的文本).

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

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

如果您不想使用其他第三方库,则始终可以选择执行原始sql stamement:

db.ExecuteStoreCommand("DELETE FROM Table WHERE FirstName = {0}", firstname);
Run Code Online (Sandbox Code Playgroud)

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