.NET Core中AutoMapper多对多关系映射异常排查求助
我来帮你一步步排查这两个AutoMapper的映射问题,咱们逐个解决:
一、书籍映射时的布尔转换错误
你收到的错误信息:
"Type Map configuration: Book -> BookDto BooksSinglePageApplication.Models.Book -> BooksSinglePageApplication.Dtos.BookDto Property: Title ---> System.FormatException: String was not recognized as a valid Boolean. at System.Boolean.Parse(String value)...."
这个问题的核心很明确:AutoMapper在尝试把Book实体的Title(字符串类型)转换成布尔类型时失败了,大概率是下面两个原因之一:
BookDto的Title属性类型定义错误
检查你的BookDto类,是不是不小心把Title写成了bool类型?比如误写为:// 错误示例 public class BookDto { public bool Title { get; set; } // 这里应该是string! // 其他属性... }修正成
string类型即可:// 正确示例 public class BookDto { public string Title { get; set; } // 其他属性... }AutoMapper映射配置错误关联了属性
检查你的映射配置代码,有没有误把Book.Title映射到了BookDto的某个布尔属性上?比如:// 错误示例 CreateMap<Book, BookDto>() .ForMember(dest => dest.IsPublished, opt => opt.MapFrom(src => src.Title)); // 这里完全错配了!修正为正确的属性映射,或者如果是默认映射(属性名一致),可以直接省略手动配置:
// 正确示例 CreateMap<Book, BookDto>(); // 或者需要自定义时确保属性类型匹配 CreateMap<Book, BookDto>() .ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Title));
二、作者集合映射的类型不匹配错误
你收到的错误信息:
"Mapping types: List
1 -> IList1 System.Colle..."
这个问题通常和集合类型的映射配置不完整有关,常见原因和解决方法:
缺少关联实体的基础映射
多对多关系中,Author通常包含List<Book>(或者中间表实体),而AuthorDto对应IList<BookDto>。AutoMapper需要先有Book到BookDto的基础映射,才能自动处理集合转换。
确保你已经创建了Book和BookDto的映射:CreateMap<Book, BookDto>();Dto集合属性类型不兼容
检查AuthorDto中的集合属性类型,比如如果Author的Books是List<Book>,那么AuthorDto的Books可以定义为IList<BookDto>或者List<BookDto>,AutoMapper会自动处理类型转换。避免使用过于特殊的集合类型(比如自定义集合),如果必须用,需要额外配置转换器。中间表的映射缺失(如果使用显式中间表)
如果你的多对多关系是通过显式中间表(比如BookAuthor)实现的,那需要为中间表实体也创建对应的Dto映射,比如:CreateMap<BookAuthor, BookAuthorDto>();这样AutoMapper才能正确解析关联关系的映射。
查询时的ProjectTo配置问题
如果你是用EF Core的ProjectTo<AuthorDto>来查询,要确保所有关联的Dto都有映射,并且EF Core能解析整个查询树。如果有复杂的关联,可能需要手动指定集合的映射方式:CreateMap<Author, AuthorDto>() .ForMember(dest => dest.Books, opt => opt.MapFrom(src => src.Books));
总结
先优先排查第一个问题的属性类型和映射配置,解决布尔转换错误后,再检查集合映射的基础配置是否完整,确保所有关联实体都有对应的映射定义。
内容的提问来源于stack exchange,提问作者Frey_ja

