如何配置AutoMapper将Post的PostTags映射到PostModel的Tags?
这个问题很典型——你的Post实体和Tag实体是通过多对多中间表PostTag关联的,而PostModel直接用List<Tag>来接收标签,但AutoMapper默认没法自动从Post.PostTags(中间表集合)里提取对应的Tag对象,所以才会出现tags为null的情况。
直接修改AutoMapper配置就能解决,代码如下:
CreateMap<Post, PostModel>() // 显式配置从Post.PostTags提取Tag集合到PostModel.Tags .ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.PostTags.Select(pt => pt.Tag).ToList())) .ReverseMap(); CreateMap<Tag, TagModel>() .ReverseMap();
为什么这么做?
你的Post实体里的PostTags是中间表PostTag的集合,每个PostTag对象都包含一个关联的Tag属性。我们需要通过Select操作从PostTags里把每个Tag提取出来,转换成List<Tag>后赋值给PostModel.Tags,AutoMapper才知道该如何完成这个映射。
(可选)如果需要反向映射(PostModel转Post实体)
如果你的业务场景需要把PostModel转回Post实体,还要补充反向的映射逻辑——因为Post里需要的是PostTag集合,而不是Tag集合:
CreateMap<Post, PostModel>() .ForMember(dest => dest.Tags, opt => opt.MapFrom(src => src.PostTags.Select(pt => pt.Tag).ToList())) .ReverseMap() .ForMember(dest => dest.PostTags, opt => opt.MapFrom(src => src.Tags.Select(t => new PostTag { Tag = t }).ToList()));
你提供的相关代码参考:
API返回的原始数据:
{ "id": 1002, "user_id": "98fd8f37-383d-4fe7-9b88-18cc8a8cd9bf", "organization_id": null, "content": "A post with a hashtag!", "created_at": "2018-05-25T21:35:31.5218467", "modified_at": "2018-05-25T21:35:31.5218467", "can_comment": true, "can_share": true, "post_tags": [ { "post_id": 1002, "tag_id": 1, "tag": { "id": 1, "value": "hashtag", "post_tags": [] } } ] }
PostModel类:
public class PostModel { public int Id { get; set; } [Required] public string UserId { get; set; } public int? OrganizationId { get; set; } [Required] public string Content { get; set; } public DateTime CreatedAt { get; set; } public DateTime ModifiedAt { get; set; } public bool CanComment { get; set; } = true; public bool CanShare { get; set; } = true; public List<Tag> Tags { get; set; } }
Tag实体(Tag.cs):
public class Tag { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } public string Value { get; set; } public ICollection<PostTag> PostTags { get; set; } = new List<PostTag>(); }
TagModel类:
public class TagModel { public int Id { get; set; } [Required] public string Value { get; set; } }
原AutoMapper配置:
CreateMap<Post, PostModel>() .ReverseMap(); CreateMap<Tag, TagModel>() .ReverseMap();
映射后的错误结果:
{ "id": 1002, "user_id": "98fd8f37-383d-4fe7-9b88-18cc8a8cd9bf", "organization_id": null, "content": "Finally a post with a hashtag!", "created_at": "2018-05-25T21:35:31.5218467", "modified_at": "2018-05-25T21:35:31.5218467", "can_comment": true, "can_share": true, "tags": null }
内容的提问来源于stack exchange,提问作者tinker
相关产品推荐
相关产品推荐

