AutoMapper Entity转Dto映射类型错误:IList<Article>转ArticleBasicDto列表失败
问题根因
- AutoMapper注册时未扫描到你的Profile配置类:你的
ArticleProfile放在Blog.Business类库中,而Startup中注册AutoMapper仅传入了MVC项目的Startup类作为扫描入口,不会跨程序集查找Profile配置,导致映射规则未生效。 - 缺少嵌套类型的映射配置:你只配置了
Article到ArticleBasicDto的映射,但ArticleBasicDto中包含的UserBasicDto、CategoryBasicDto对应的实体到Dto的映射规则未配置,AutoMapper无法自动完成嵌套属性的映射。
解决方案
1. 补全映射Profile配置
修改你的ArticleProfile类,添加缺失的嵌套类型映射,同时可以删掉冗余的ForMember配置(属性名一致时AutoMapper会默认自动映射):
namespace Blog.Business.AutoMapper.Profiles { public class ArticleProfile : Profile { public ArticleProfile() { // 补全嵌套类型映射 CreateMap<User, UserBasicDto>(); CreateMap<Category, CategoryBasicDto>(); // 原Article映射可以简化,无需显式配置同名属性映射 CreateMap<Article, ArticleBasicDto>(); } } }
2. 修改AutoMapper服务注册
修改Startup.cs中的AddAutoMapper调用,传入Profile所在的类作为扫描入口,确保AutoMapper能加载到所有映射规则:
// 替换原有的services.AddAutoMapper(typeof(Startup)); services.AddAutoMapper(typeof(Startup), typeof(ArticleProfile));
(可选)优化查询性能
你当前是先查出全量Article实体再做映射,可以改用AutoMapper的ProjectTo方法直接在EF查询阶段完成映射,减少数据库查询字段,同时从根源避免循环引用问题:
using AutoMapper.QueryableExtensions; public async Task<IDataResult<ArticleBasicListDto>> GetAllBasic() { var mapping = await _unitOfWork.Articles .Query() // 替换为你实际的IQueryable查询入口 .ProjectTo<ArticleBasicDto>(_mapper.ConfigurationProvider) .ToListAsync(); return new DataResult<ArticleBasicListDto>(ResultStatus.Success, new ArticleBasicListDto() { Articles = mapping, }); }
内容的提问来源于stack exchange,提问作者ATK
相关产品推荐
相关产品推荐

