You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:24:01