为什么RemoveRange没有清除DbSet?

时间:2018-02-05 20:17:40

标签: c# dbset

我有以下扩展方法来清除DbSet<T>

public static void Clear<T>(this DbSet<T> dbSet)
{
    dbSet.RemoveRange(dbSet);
}

用法如下:

databaseContext.Users.Clear();
databaseContext.SaveChanges();

现在的问题是:为什么代码不能正常工作,为什么表用户不空?

修改

正确的答案是SaveChanges因为相互的实体关系而引发异常,因此不会删除某些实体。我没有注意到异常,因为它作为一个[集成] MSTest套件的清理运行,所有测试都通过了。但是,我的原始实现仍然包含另一个错误,因此我将其中一个响应标记为 响应。

2 个答案:

答案 0 :(得分:1)

这是因为deferred execution而发生的。 尝试:

 dbSet.RemoveRange(dbSet.ToList());

答案 1 :(得分:0)

在执行RemoveRange的上下文中,没有从数据库中检索到任何行。通过在RemoveRange dbSet.RemoveRange(dbSet.ToList())之前添加ToList(),结果更好。请记住,RemoveRange会逐个删除..

..我们来表演的地方。如果您希望以良好的性能清除大量数据:

  • 使用SqlCommand(整个表)或
  • 截断表
  • 使用external library
  • 中的批量操作