繁体   English   中英

辅助功能,用于删除/删除所有实体数据,EF

[英]Helper function to remove/delete all entity data, EF

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

目前,我的工作方式是:

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

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

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

改用原始SQL:

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

它将仅对数据库进行一次调用,并让DB一步完成整个删除操作,这将大大提高效率。 如果所涉及的表很大,则可能值得使用TRUNCATE TABLE来获得一些性能。

你可以用一个通用的

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

然后可以这样称呼它:

 DeleteData<User>()

如果要删除所有用户,则。

我建议在这里使用sql。 由于EF会加载这些实体中的每个实体然后将其删除,因此您的处理方式会占用大量数据。 非常贵。

只需编写sql“从CertLevelValues删除”或删节表即可。

特别是对于大型数据集,速度明显更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM