帮助函数删除/删除所有实体数据,EF

时间:2013-06-24 15:04:34

标签: c# entity-framework

在我的种子数据文件中,我首先删除特定实体中的所有条目,然后添加新条目。但是我觉得可以改进(或清理)删除数据的代码。

目前我的表现如下:

 var oldCertCat = context.CertCategoryValues.ToList();
 oldCertCat.ForEach(cat => context.CertCategoryValues.Remove(cat));

下一个实体:

 var oldCertLevel = context.CertLevelValues.ToList();
 oldCertLevel.ForEach(certLevel => context.CertLevelValues.Remove(certLevel));

我正在考虑创建一个辅助函数,如:

void DeleteData("EntityName")
{
    var oldData = context."EntityName".ToList();
    oldData.ForEach(item => context."EntityName".Remove(item));
}

这样会更清洁。有什么建议吗?

3 个答案:

答案 0 :(得分:5)

使用EF删除大量数据效率非常低。它首先从数据库加载所有实体,然后逐个删除它们。

改为使用原始SQL:

void Deletedata(string tableName)
{
  context.Database.ExecuteSqlCommand("DELETE FROM {0}", tableName);
}

它只会对数据库进行一次调用,让DB在一步中完成整个删除操作,效率更高。如果涉及的表格很大,则可能值得使用TRUNCATE TABLE来获得一些性能。

答案 1 :(得分:1)

您可以使用通用

来完成
void DeleteData<T>() where T : class
{
    var oldData = context.Set<T>().ToList();
    oldData.ForEach(item => context.Set<T>().Remove(item));
    context.SaveChanges();
}

然后您可以将其称为:

 DeleteData<User>()

如果要删除所有用户。

答案 2 :(得分:1)

我建议在这里使用sql。你这样做的方式是数据密集型,因为EF加载每个实体然后删除它们。很贵。

只需编写一个sql“从CertLevelValues中删除”或截断表。

显着更快,特别是对于大型数据集。