2016-01-11 95 views
1

VS 2105,MVC5的EntityFramework 6碼的第一個項目變化的foreach不保留

我成功地填充我的ViewModel的IEnumerable(IQueryable的嘗試也),然後在foreach循環修改。

如果我逐句通過foreach字段更新,但是當我檢查IEnumerable中的單個ViewModel時,更改不會持續。

的foreach:

foreach (var app in applVms) { app.Preliminary = true; } 

(其實我想提出另外的查詢到孩子表,但我已經簡化爲這個職位)

初步是假的的foreach之前和之後,但設置爲true內的foreach。

填充視圖模型:

IEnumerable<ApplicationVm> applVms; 
    applVms = from app in _db.Applications 
      select new ApplicationVm { ... Preliminary = false, ... }; 
+1

您尚未顯示足夠的代碼來解決問題。例如,包括你如何檢查「它不會持續」。 –

+0

每次枚舉appleVms時,都要從數據庫中獲取它。您沒有保留更改,因此不會設置「初步」。如果它足夠小以適應內存,則將'.ToList()'添加到applVms中,它將起作用。 –

+0

更多代碼不需要。伊恩走近了,但沒有提供完整的答案。看Yacoub的答案。 – Joe

回答

3

由於您的applVms枚舉是基於LINQ查詢,然後它使用deferred execution這意味着不執行查詢,直到你枚舉的結果。

此外,每次您枚舉applVms時,都會再次計算結果(查詢將在另一次執行)。

當你第一次通過foreach打開時,你得到了一組對象,然後你修改了這些對象。

當您通過applVms查看結果(這是您第二次枚舉)時,它給了您全新的對象集合(通過再次執行查詢)。

爲了驗證這一點使用下面的代碼:

IEnumerable<ApplicationVm> applVms; 
applVms = (from app in _db.Applications 
      select new ApplicationVm {Preliminary = false}).ToList(); 

//foreach here 

這將枚舉枚舉的一次,並把它放在一個列表,以便將來枚舉將使用相同的集合。

+0

謝謝雅各布。我實際上曾嘗試ToList(),但它不會編譯。我錯過了()的額外集合。 – Joe