为什么 RemoveRange 不清除 DbSet?

Why is RemoveRange not clearing DbSet?

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

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

用法如下:

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

现在的问题是:为什么代码不起作用,为什么 table 用户不为空?

编辑

正确答案是SaveChanges由于相互实体关系而抛出异常,因此一些实体没有被删除。我没有注意到异常,因为它 运行 作为 [集成] MSTest 套件的清理,所有测试都通过了。但是,我最初的实现确实包含另一个错误,所以我将其中一个指出它的响应标记为 the response.

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

..我们开始表演的地方。如果您想清除大量数据并获得良好的性能:

  • 使用 SqlCommand 截断 table(整个 table)或
  • 使用来自 external library
  • 的批量操作

发生这种情况是因为 deferred execution。 尝试:

 dbSet.RemoveRange(dbSet.ToList());