1

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

目前我正在这样做:

 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));
}

这样会更干净。有什么建议么?

4

3 回答 3

5

用 EF 删除大量数据是非常低效的。它首先从数据库中加载所有实体,然后将它们一一删除。

改用原始 SQL:

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

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

于 2013-06-24T15:11:52.320 回答
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>()

如果你想删除所有用户然后。

于 2013-06-24T15:09:59.730 回答
1

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

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

明显更快,尤其是对于大型数据集。

于 2013-06-24T15:11:15.667 回答