2016-01-11 60 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