2011-03-21 91 views
0

我試圖從DataContext對象查詢被稱爲「國」的數據表,並收到下面的異常:集合被修改例外

集合被修改;枚舉操作可能不會執行

下面的代碼片段:

foreach (Nation thisNation in NationList) 
{ 
    Nation nation = nationDB.Nations.Where(c => c.ID == thisNation.ID).First(); 
    nation.Duplicate(thisNation); 
} 

Duplicate()是一種方法,拷貝Nation對象的某些屬性:

我使用與EF CTP5。

我在做什麼錯?

+2

只是看着它,這應該工作,你可以擴大代碼剪切了一下,包括'Duplicate()'和'SaveChanges()'的實現嗎? – BrokenGlass 2011-03-21 18:02:00

回答

4

雖然在這裏並不直接明顯,但問題通常是您使用的foreach只能枚舉項目,並且不允許您直接操作集合。當Linq參與時,這種方法可能會變得更加激動人心。

您可以取代你有一個簡單的for循環應該解決的問題 - 但是,這並打開另一個潛在的問題,你不應該解決這個問題:你需要管理哪些自動遞增當前索引/遞減由for,以免你會得到'關閉x問題'。

+0

即使我嘗試同時使用你的方法和AJ方法,我仍然遇到這個問題... – Francesco 2011-03-21 21:04:20

+0

你說這個問題出現在SaveChanges中,這裏的代碼片段並沒有顯示我們要修改的集合 - 好吧,我們可以看到更多的代碼? – 2011-03-21 21:10:24

+0

The Class Nation有字段:int ID,字符串名稱,列表區域。方法Duplicate正在逐一複製每個字段。 – Francesco 2011-03-21 21:24:31

1

這是「修改封鎖」的惡魔。試試這樣做:

foreach (Nation thisNation in NationList) 
{ 
    var tempNation = thisNation; 
    Nation nation = nationDB.Nations.Where(c => c.ID == tempNation.ID).First(); 
    nation.Duplicate(tempNation); 
} 

好帖子here與更多信息。

+4

我不明白這將如何起作用,因爲「每個閉包」僅使用一次(呼叫First實現查詢)。 – 2011-03-21 17:29:26