对象属性未更新

Pak*_*Pat 2 c# asp.net-mvc object-properties

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

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

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

逻辑如下:

//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);
Run Code Online (Sandbox Code Playgroud)

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

编辑:在返回给调用者之前检查上面最后一行的 movieDto 时,我发现相关电影的名称尚未更新。

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; }
    }
Run Code Online (Sandbox Code Playgroud)

Fed*_*uma 6

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

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

要解决此问题,只需在操作之前将集合转换为列表即可:

var moviesDto = moviesQuery.ToList()
        .Select(Mapper.Map<Movie, MovieDto>).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 为了让我了解这种行为,我创建了一个小提琴,演示它:https://dotnetfiddle.net/iKjVkW - 以防其他人需要看到这个行为...... (2认同)