假設對循環內的EF實體進行更改,在foreach循環或循環外調用EF SaveChanges()之間是否存在任何性能優勢/技術差異?在foreach循環內部和外部調用SaveChanges()之間的區別?
3
A
回答
17
是的!
如果你把它叫做循環中,EF會寫回更改數據庫爲每一個實體(每實體將在其自己的,獨立的交易)。
另一種方法是,您將進行所有更改,並且EF將在循環後(一次對所有實體一起進行單個事務)立即將它們寫回。
作爲一般經驗法則(沒有真正看到您的代碼)儘量少量撥打.SaveChanges()
。
有50次更改的呼叫通常比50次呼叫每次更換1次更好/更快/更有效。
0
在這個循環的外面將只創建一個事務來更新數據庫,而另一個創建每個迭代的一個事務。由於EF使用工作單元模式,該模式保留了內存中的所有更改,並在SaveChanges方法中保存了對數據庫所做的所有更改。
0
性能將會是不同,在循環內部您將調用每個數據庫上的循環。外部循環你將調用數據庫一次。這可能會導致性能上的巨大差異,具體取決於您有多少次迭代。
6
另一個要說的是,假設你的foreach循環遍歷在你的DbContext中活動的EntitySet,你將得到一個System.Data.SqlClient.SqlException:另一個線程正在會話中運行。
這是因爲foreach實際上在另一個線程中運行,並且這不允許事務完成。
除了上面提到的交易更少的交易之外。
假設你有一個上下文DB並執行以下操作:
var groups = from i in db.items select i.GroupNumber;
foreach(var grp in groups)
{
//... do something
db.SaveChanges();
}
這會拋出異常
一個解決方案,以避免這一點(如果合適的話!)是「兌現」的羣體的EntitySet通過將它們納入對象空間通過改變第一線爲:
var groups = (from i in db.items select i.GroupNumber).ToList();
這將讓你在foreach保存(如果需要)
相關問題
- 1. 變量內部For循環和外部循環之間的區別
- 2. 在foreach循環或外部調用flush()之間的區別,使用哪一個?
- 3. 變量初始化外部和for循環之間的區別
- 4. 外部和內部表格性能之間的區別?
- 5. 內部IP地址和外部IP地址之間的區別
- 6. for循環中聲明變量和外部循環之間有什麼區別?
- 7. 嵌入式系統內部,內聯,外部之間的區別?
- 8. 打破內部的foreach循環,並繼續外部的foreach循環
- 9. 調用getActivity()。startActivity();之間的區別和startActivity();內部片段
- 10. C#中IEnumerable類的foreach和for循環之間的區別
- 11. SimpleXMLElement PHP for和foreach循環之間的區別?
- 12. 在java中運行內部和外部unix命令之間的區別
- 13. htaccess內部和外部請求區別
- 14. foreach循環內部變量
- 15. 內部foreach循環php
- 16. while foreach內部循環
- 17. 「命名空間」內部或外部的「使用」(導入)之間的區別?
- 18. 在類內部和外部呼叫者之間進行區分
- 19. 內部和外部雜注之間的區別是否包括警衛?
- 20. ARM體系結構內部和外部執行之間的區別
- 21. 添加內部和外部事件偵聽器之間的區別(AS3)
- 22. 在循環內部分配內存vs外部循環
- 23. 運行VS內部和外部調試器有什麼區別?
- 24. PHP退出內部foreach循環並繼續執行外部循環
- 25. 在Javascript中使用數組的外部和內部循環
- 26. 使用Apache HAWQ時外部表與內部表之間的區別?
- 27. 在構造函數內部或外部聲明變量之間的區別?
- 28. 在函數內部或外部分配方法與原型之間的區別
- 29. dexing和部署之間的區別?
- 30. 構建和部署之間的區別?
感謝您的快速響應!那麼,循環之外實際上是更快還是性能優勢非常小? – jaffa
是的,它會在大多數時間更多的表現。除非你有一個迭代需要很長時間的工作(可能是一些繁重的IO處理)。 –