适配模型后映射缺失:将AuthorRequest适配为Book时返回Null求助
解决AutoMapper/Mapster适配Book模型返回Null的问题
看起来你在创建Author时,尝试把请求里关联的Books转成Book实体集合时遇到了Null的问题——毕竟转Author是正常的,转Book就不行,大概率是模型结构不匹配或者映射配置没到位,下面分情况给你解决方案:
先排查最基础的问题:请求数据是否正确绑定到AuthorRequest?
首先得确认你的AuthorRequest模型里有没有正确接收JSON里的Books数据:
- 检查请求JSON里的Books字段名是不是和
AuthorRequest里的属性名匹配(比如JSON里是"books",但模型里是Books?如果你的JSON序列化是大小写敏感的,这会导致model.Books本身就是Null,那后续转Book肯定也是Null)。 - 可以在调试时查看
model.Books的值,如果它本身就是Null,先解决请求绑定的问题——给属性加[JsonPropertyName("books")](使用System.Text.Json时)或者[JsonProperty("books")](使用Newtonsoft.Json时)来指定JSON键名:
public class AuthorRequest { public string Name { get; set; } [JsonPropertyName("books")] // 匹配JSON里的键名 public List<BookRequestDto> Books { get; set; } }
如果请求绑定正常,那就是映射的问题
你用的Adapt方法大概率是AutoMapper或者Mapster的,两种情况分别处理:
1. 如果你用的是AutoMapper
AutoMapper不会自动帮你把整个AuthorRequest转成Book(毕竟AuthorRequest是包含Author信息+Books集合的对象),你应该提取model.Books集合再转成Book实体,而不是直接把整个model转成Book:
public async Task<AuthorRequest> CreateAsync(AuthorRequest model) { var authorEntity = model.Adapt<Author>(); // 正常工作 // 正确做法:取model里的Books集合,再转成Book实体集合 var bookEntities = model.Books.Adapt<IEnumerable<Book>>(); // 接下来保存author和bookEntities到数据库... }
另外,你需要确保AutoMapper配置了BookRequestDto到Book的映射:
public class MappingProfile : Profile { public MappingProfile() { CreateMap<AuthorRequest, Author>(); // 已正常工作的映射 CreateMap<BookRequestDto, Book>(); // 新增子对象的映射配置 } }
2. 如果你用的是Mapster
Mapster的Adapt默认支持属性名匹配,但同样需要针对子对象配置(如果属性名不匹配的话):
- 先确保
BookRequestDto和Book的属性名对应,比如BookRequestDto里的Title对应Book里的Title。 - 直接映射集合即可:
var bookEntities = model.Books.Adapt<List<Book>>();
如果有属性名不匹配,比如BookRequestDto里是BookTitle,Book里是Title,可以加配置:
TypeAdapterConfig<BookRequestDto, Book>.NewConfig() .Map(dest => dest.Title, src => src.BookTitle);
最后一个坑:Book实体有没有无参构造函数?
不管是AutoMapper还是Mapster,都需要目标实体(也就是Book)有无参构造函数才能创建实例。如果你的Book只有带参数的构造函数,要么加一个无参的,要么在映射配置里指定构造参数:
// AutoMapper的配置示例 CreateMap<BookRequestDto, Book>() .ConstructUsing(src => new Book(src.Title, src.Pages));
内容的提问来源于stack exchange,提问作者beetlejuice
相关产品推荐
相关产品推荐

