簡體   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