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

AutoMapper无法创建抽象类型实例:多对多映射问题求助

解决AutoMapper映射多对多集合时的抽象类实例化异常

这个问题的核心原因很明确:当你配置Essay的Books集合映射时,AutoMapper需要把Entities.Book转换为Dtos.Book,但你没有显式配置这个映射关系。加上DTO的基类Dto<TId>是抽象类型,AutoMapper在解析映射逻辑时错误地尝试实例化抽象的Dto<long>,最终抛出了Cannot create an instance of abstract type Dtos.Dto1[System.Int64]`异常。

之前单独映射Essay时一切正常,是因为那时没有触发Book实体到DTO的转换逻辑——AutoMapper只需要处理Essay自身的属性,不需要处理关联的Book集合,自然不会暴露这个问题。

解决方案

你需要在映射配置中补充Entities.Book到Dtos.Book的映射规则,同时包含基类的映射逻辑,让AutoMapper明确知道该如何将实体转换为对应的具体DTO类型。

修改你的EssayBookProfile类,添加Book的映射配置:

namespace DtoMapping {
    internal sealed class EssayBookProfile : Profile {
        public EssayBookProfile() {
            // 先配置Book实体到DTO的映射
            this.CreateMap<Entities.Book, Dtos.Book>()
                .IncludeBase<Entities.Entity<long>, Dtos.Dto<long>>();
            
            // 再配置Essay实体到DTO的映射
            this.CreateMap<Entities.Essay, Dtos.Essay>()
                .IncludeBase<Entities.Entity<long>, Dtos.Dto<long>>()
                .ForMember(dto => dto.Books, opt => opt.MapFrom(e => e.EssayBooks.Select(pl => pl.Book)));
        }
    }
}

额外说明

  • AutoMapper不会自动推断跨命名空间的同名类映射关系,必须显式声明Entities.Book到Dtos.Book的映射规则
  • IncludeBase方法确保基类的属性(比如Id)能被正确继承映射
  • 因为你的Dtos.Essay中的Books是List<Dtos.Book>类型,AutoMapper必须明确知道如何将Entities.Book转换为具体的Dtos.Book,否则会 fallback 到尝试实例化抽象基类,引发异常

内容的提问来源于stack exchange,提问作者Sergio Romero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:37:02