.NET使用EF批量插入數(shù)據(jù),一行代碼性能飆升!
共 2196字,需瀏覽 5分鐘
·
2024-07-12 23:08
代碼示例
開始的批量添加代碼
public async void AddRangeAsync(List<T> entities)
{
await _dbContext.AddRangeAsync(entities);
await _dbContext.SaveChangesAsync();
}
在以上方法增加一行,如下:
public async void AddRangeAsync(List<T> entities)
{
//批量添加需要將AutoDetectChangesEnabled給位false
_dbContext.ChangeTracker.AutoDetectChangesEnabled = false;
await _dbContext.AddRangeAsync(entities);
await _dbContext.SaveChangesAsync();
}
原理
微軟的解釋:AutoDetectChangesEnabled默認(rèn)值為 true。這可確保上下文在執(zhí)行操作(例如 SaveChanges() 或返回更改跟蹤信息)之前了解對跟蹤實體實例所做的任何更改。如果禁用自動檢測更改, DetectChanges() 則必須確保在修改實體實例時調(diào)用 。
如果不這樣做,可能會導(dǎo)致某些更改在返回或返回過時的更改跟蹤信息期間 SaveChanges() 無法持久保存。
這是啥意思呢?ChangeTracker的AutoDetectChangesEnabled屬性是Entity Framework中的一個屬性,用于控制是否自動檢測實體的更改。
默認(rèn)情況下,AutoDetectChangesEnabled屬性的值為true,即自動檢測更改。每次對實體進(jìn)行更改(添加、刪除、更新)時,Entity Framework會自動檢測這些更改,并將其標(biāo)記為“已更改”。這樣,在調(diào)用SaveChanges方法時,Entity Framework會自動將這些更改應(yīng)用到數(shù)據(jù)庫中。
當(dāng)AutoDetectChangesEnabled屬性的值為true時,將對EF的性能造成一定的影響,尤其是批量插入數(shù)據(jù)。
對于插入操作,無論AutoDetectChangesEnabled的值為true還是false,都可以成功插入數(shù)據(jù)。因為插入操作本身就是一種新增操作,無需進(jìn)行實體的更改檢測。所以在批量插入時,建議把AutoDetectChangesEnabled設(shè)置為false。
設(shè)置為false具體對操作的數(shù)據(jù)有沒有影響呢?
答案是肯定的,分情況。如果插入數(shù)據(jù)后有上下文操作,那么上下文不會自動更新實體的狀態(tài),如果沒有后續(xù)操作可以忽略。
這就需要手動調(diào)用DetectChanges方法或?qū)嶓w狀態(tài)設(shè)置為“已更改”才能使上下文與數(shù)據(jù)庫同步。
建議批量插入數(shù)據(jù)結(jié)束時,把AutoDetectChangesEnabled的值改為true。
結(jié)語
本文講述了.NET用EF批量插入數(shù)據(jù),改進(jìn)性能的簡單方法。
當(dāng)然還有很多方法,比如可以使用EF批量添加擴展,可以在EF中執(zhí)行SQL插入語句,還可以用EF執(zhí)行存儲過程的方式批量添加(SQL Server實驗過,MySql未實驗)等,大家還有啥好方法可以留言。
日志分析建議大家用mangodb或者ES等數(shù)據(jù)庫,本案例只是臨時數(shù)據(jù)分析。希望本文對你有所收獲,歡迎留言或者吐槽。
轉(zhuǎn)自:翔星
鏈接:cnblogs.com/xbhp/p/17540769.html
