前臂的变化未保留

本文关键字:保留 变化 | 更新日期: 2023-09-27 18:29:48

VS 2105,MVC5 EntityFramework 6代码第一项目

我成功地填充了ViewModel的IEnumerable(也尝试了IQueryable),然后在foreach循环中进行修改。

如果我遍历foreach,字段就会更新,但当我检查IEnumerable中的单个ViewModel时,更改不会持久存在。

foreach:

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

(事实上,我正在对子表进行额外的查询,但我已经简化了这篇文章)

Preliminary在foreach之前和之后为false,但在foreach内部设置为true。

填充视图模型:

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

前臂的变化未保留

由于applVms枚举表基于LINQ查询,因此它使用延迟执行,这意味着在枚举结果之前不会执行查询。

此外,每次在applVms上枚举时,都会再次计算结果(查询将在另一次执行)。

当您第一次通过foreach循环时,您得到了一组对象,然后修改了这些对象。

当您在applVms上枚举以查看结果时(这是您第二次枚举),这为您提供了一个全新的对象集合(通过再次执行查询)。

要对此进行验证,请使用以下代码:

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

这将枚举可枚举项一次,并将其放在列表中,以便将来的枚举将使用相同的集合。