.NET Core Web API HttpGet接口无法读取Movie类ICollection<Actor>属性如何解决
问题修复方案
你遇到的问题由两个核心原因导致:
- EF Core默认不会自动加载关联的导航属性,你当前的查询逻辑仅加载了
Genre和Director,没有加载Actors关联数据 - 若Actor实体类包含反向指向Movie的导航属性,序列化返回结果时会触发循环引用报错
修复步骤
1. 补充加载Actors导航属性
修改GetMoviesQuery的Handle方法,在查询时新增Include加载演员数据:
public List<GetMoviesModel> Handle() { var _movieList = _context.Movies .Include(x => x.Genre) .Include(y => y.Director) .Include(z => z.Actors) // 新增此行加载关联演员数据 .OrderBy(z => z.Id) .ToList<Movie>(); List<GetMoviesModel> mv = _mapper.Map<List<GetMoviesModel>>(_movieList); return mv; }
2. 处理循环引用问题(二选一即可,更推荐方案二)
方案一:配置序列化忽略循环引用
在项目启动配置(.NET 6+为Program.cs)中添加Json序列化规则,忽略循环引用:
builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles; });
方案二:使用自定义DTO避免暴露实体类(更安全规范)
不要在返回模型GetMoviesModel中直接使用数据库实体类Actor,自定义仅包含返回字段的DTO,避免反向导航属性导致的循环引用:
首先定义演员DTO:
public class ActorDto { public int Id { get; set; } public string Name { get; set; } // 按需添加其他需要返回的演员字段,不要添加指向Movie的导航属性 }
修改GetMoviesModel中的Actors属性类型:
public class GetMoviesModel { public string Name { get; set; } public string ReleaseDate { get; set; } public string Genre { get; set; } public string Director { get; set; } public float Price { get; set; } public ICollection<ActorDto> Actors { get; set; } }
最后在AutoMapper配置中添加Actor到ActorDto的映射规则即可。
内容的提问来源于stack exchange,提问作者Oguz
相关产品推荐
相关产品推荐

