2012-04-10 18 views
127

關於爲什麼這可能會破壞的任何想法?新的交易是不允許的,因爲會話中還有其他線程正在運行LINQ To Entity

foreach (var p in pp) 
{ 
    ProjectFiles projectFile = (ProjectFiles)p; 
    projectFile.Status = Constants.ProjectFiles_ERROR; 
    projectFile.DateLastUpdated = DateTime.Now; 
    context.SaveChanges(); 
} 

我看到解決問題的辦法是在foreach循環之前一次檢索結果。

但我沒有那樣做? 「pp」是我的結果集合

+10

'pp'是linq查詢的結果嗎?如果是這樣,您可能需要在運行循環之前對其執行'ToList()'以將其與數據庫斷開連接。 – SouthShoreAK 2012-04-10 21:13:27

+0

是的。好的,我會嘗試,謝謝 – 2012-04-10 21:14:39

+2

呼叫保存更改循環外 – Mohsin 2014-06-23 08:56:43

回答

321

pp變量不是對象的集合,它是一個可以返回對象的枚舉器。在使用枚舉器時,源必須保持打開狀態。使用ToList方法將枚舉器實現爲集合。這將讀取枚舉器中的所有項目並關閉與源的連接,以便您可以將連接用於其他事情。

foreach (var p in pp.ToList()) 
+14

上帝保佑你@Guffa! +1 – 2013-05-21 03:09:30

+2

太棒了!它也可以與pp.ToArray() – 2013-09-10 00:37:15

+2

Ricardo一起使用,只要它不是IQueryable,它就會工作。 – 2013-11-18 03:42:34

7

發生了什麼事是你正在使用一個SQL連接遍歷數據庫實體的集合,然後用另一個連接保存更改。發生這種情況是因爲你的類基本上已經「結婚」到你的db連接的一個實例,並且不能被另一個實例改變。

解決此問題的一種方法是在迭代之前調用集合上的.ToList()。

而你在這個時候,在循環結束後只需要調用context.SaveChages()來加速代碼。

相關問題