对象 属性 未更新
Object property not updating
我的 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 循环中 运行 时间检查了电影对象,确实发现某些电影的名称 属性 附加了 "N/A :("它。
但在视图中,只显示电影的(原始)名称。
编辑:在返回给调用者之前检查最后一行上的 moviesDto,我发现相关电影的名称尚未更新。
FWIW,这是 movieDto class 定义:
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; }
}
您的问题源于使用 IEnumerable
(由于 LINQ deferred execution),并且是由于您的 moviesDto
对象实际上是一个 LINQ 查询。
每次枚举 moviesDto
时,都会再次执行查询并从源中拾取对象(每次再次将实体化实体映射到新的 DTO)。
要解决,只需在操作之前将您的集合转换为列表即可:
var moviesDto = moviesQuery.ToList()
.Select(Mapper.Map<Movie, MovieDto>).ToList();
我的 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 循环中 运行 时间检查了电影对象,确实发现某些电影的名称 属性 附加了 "N/A :("它。 但在视图中,只显示电影的(原始)名称。
编辑:在返回给调用者之前检查最后一行上的 moviesDto,我发现相关电影的名称尚未更新。
FWIW,这是 movieDto class 定义:
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; }
}
您的问题源于使用 IEnumerable
(由于 LINQ deferred execution),并且是由于您的 moviesDto
对象实际上是一个 LINQ 查询。
每次枚举 moviesDto
时,都会再次执行查询并从源中拾取对象(每次再次将实体化实体映射到新的 DTO)。
要解决,只需在操作之前将您的集合转换为列表即可:
var moviesDto = moviesQuery.ToList()
.Select(Mapper.Map<Movie, MovieDto>).ToList();