在我的种子数据文件中,我首先删除特定实体中的所有条目,然后添加新条目。但是我觉得可以改进(或清理)删除数据的代码。
目前我的表现如下:
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));
}
这样会更清洁。有什么建议吗?
答案 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中删除”或截断表。
显着更快,特别是对于大型数据集。