2013-06-24 67 views
1

在我的種子數據文件中,我首先刪除特定實體中的所有條目,然後添加新的。不過,我覺得可以改進(或清除)刪除數據的代碼。輔助函數刪除/刪除所有實體數據,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)); 
} 

這樣會更這種方式更清潔。有什麼建議麼?

+0

在Code Review上提出這個問題可能會更好。 – dandan78

+0

感謝分享網站@ dandan78。新對我來說。 – Rohit

回答

5

用EF刪除大量數據效率很低。它首先加載數據庫中的所有實體,然後逐個刪除它們。

使用原始的SQL語句來代替:

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

它將使只需一個電話到數據庫,並讓DB做整個刪除在一個步驟,是更有效的。如果涉及的表格很大,則可能值得使用TRUNCATE TABLE來獲得一些性能。

+0

這是真正的解決方案。 其他技巧將檢索所有行並逐個刪除它們。 – Damien

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>() 

,如果你想刪除所有用戶即可。

+0

枚舉是EF中的有效實體。是否需要約束? –

+0

啊是枚舉,忘了那個。我想你可以刪除T:class的地方。 – Maximc

+0

@Maximc。謝謝,你可以編輯你的文章:它應該是一個方法調用context.Set ().ToList();而不是上下文。Set .ToList();.看起來像一個錯字 – Rohit

1

我會建議在這裏使用sql。你這樣做的方式是數據密集型的,因爲EF加載每個實體然後刪除它們。非常貴。

只需寫一個sql「從CertLevelValues刪除」或截斷表。

顯着更快,特別是對於大型數據集。