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
相关产品推荐
相关产品推荐

