2012-06-21 39 views

回答

17

是的!

如果你把它叫做循環中,EF會寫回更改數據庫爲每一個實體(每實體將在其自己的,獨立的交易)。

另一種方法是,您將進行所有更改,並且EF將在循環後(一次對所有實體一起進行單個事務)立即將它們寫回

作爲一般經驗法則(沒有真正看到您的代碼)儘量少量撥打.SaveChanges()

有50次更改的呼叫通常比50次呼叫每次更換1次更好/更快/更有效。

0

在這個循環的外面將只創建一個事務來更新數據庫,而另一個創建每個迭代的一個事務。由於EF使用工作單元模式,該模式保留了內存中的所有更改,並在SaveChanges方法中保存了對數據庫所做的所有更改。

+0

感謝您的快速響應!那麼,循環之外實際上是更快還是性能優勢非常小? – jaffa

+1

是的,它會在大多數時間更多的表現。除非你有一個迭代需要很長時間的工作(可能是一些繁重的IO處理)。 –

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保存(如果需要)

相關問題