对象属性不更新

时间:2017-05-08 20:03:31

标签: c# asp.net-mvc object-properties

我的MVC5项目视图对存在以下逻辑的api / movies进行api调用:

(首先,这是moviesDto实例化的方式):

var moviesQuery = _context.Movies.Include(m => m.Genre);
var moviesDto = moviesQuery.ToList()
            .Select(Mapper.Map<Movie, MovieDto>);

这是逻辑:

//for regular API call add N/A to items that are not available
    foreach (MovieDto movie in moviesDto)
    {
        if (movie.NumberAvailable == 0)
                movie.Name = movie.Name + " N/A. :(";
    }
    return Ok(moviesDto);

我在调试模式下在运行时在Foreach LOOP中检查电影对象,并且确实发现某些电影的名称属性附加了“N​​ / A :(”。 但在视图中,只显示电影的(原始)名称。

编辑:在检查电影到播放器之前的最后一行上的电影时,我发现相关电影的名称尚未更新。

FWIW,这是movieDto类的定义:

public class MovieDto
    {
        public int Id { get; set; }

        [Required]
        [StringLength(100)]
        public string Name { get; set; }

        [Required]
        public byte GenreId { get; set; }

        public GenreDto Genre { get; set; }

        public DateTime ReleaseDate { get; set; }

        public DateTime DateAdded { get; set; }

        [Range(1, 25)]
        public byte NumberInStock { get; set; }

        public byte NumberAvailable { get; set; }
    }

1 个答案:

答案 0 :(得分:2)

您的问题源于使用IEnumerable(由于LINQ deferred execution),并且是由于您的moviesDto对象实际上是LINQ查询这一事实引起的。

每次枚举moviesDto时,都会再次执行查询,并从源中拾取对象(每次将物化实体再次映射到新的DTO)。

要解决此问题,只需将您的集合转换为列表,然后再进行操作:

var moviesDto = moviesQuery.ToList()
        .Select(Mapper.Map<Movie, MovieDto>).ToList();