如何配置AutoMapper,使属性每次映射时生成对象新实例并填充BlogId?
解决AutoMapper映射时自动创建新实例并填充指定字段的问题
我来帮你搞定这个AutoMapper的映射需求!你想要每次映射模型到视图模型时,CreateCommentForm都是全新实例,并且自动填充它的BlogId字段,不用再忽略这个属性对吧?下面给你两种实用的解决方案:
方案一:使用ConstructUsing直接创建并初始化实例
这是最直接的方式,适合你需要空表单仅填充BlogId的场景。首先假设你的模型和视图模型结构大概是这样:
// 实体模型 public class BlogPost { public int Id { get; set; } // 其他业务属性... } // 视图模型 public class BlogPostViewModel { public int Id { get; set; } // 其他视图属性... public CreateCommentForm CreateCommentForm { get; set; } } // 评论表单模型 public class CreateCommentForm { public int BlogId { get; set; } // 表单其他字段(比如评论内容等)... }
然后在AutoMapper的配置中,针对CreateCommentForm属性配置ConstructUsing,主动创建新实例并填充BlogId:
var mapperConfig = new MapperConfiguration(cfg => { cfg.CreateMap<BlogPost, BlogPostViewModel>() .ForMember(dest => dest.CreateCommentForm, opt => opt.ConstructUsing(src => new CreateCommentForm { BlogId = src.Id })); }); // 初始化映射器 var mapper = mapperConfig.CreateMapper();
这样每次执行映射时:
- 会自动创建一个全新的
CreateCommentForm实例 - 自动把源
BlogPost的Id赋值给新实例的BlogId - 完全不需要再忽略这个属性,完美适配你构建空表单的需求
方案二:单独配置表单映射(适合扩展场景)
如果之后你需要给CreateCommentForm映射更多字段,可以先单独配置它和BlogPost的映射规则,再关联到视图模型的映射中:
var mapperConfig = new MapperConfiguration(cfg => { // 先配置BlogPost到CreateCommentForm的映射 cfg.CreateMap<BlogPost, CreateCommentForm>() .ForMember(dest => dest.BlogId, opt => opt.MapFrom(src => src.Id)) // 忽略其他不需要映射的表单字段,保证是"空表单" .ForAllOtherMembers(opt => opt.Ignore()); // 再配置BlogPost到视图模型的映射 cfg.CreateMap<BlogPost, BlogPostViewModel>() .ForMember(dest => dest.CreateCommentForm, opt => opt.MapFrom(src => src)); // 复用上面的映射规则创建新实例 });
这种方式扩展性更强,以后如果表单需要新增映射字段,只需要修改BlogPost到CreateCommentForm的配置即可。
为什么之前的忽略方式可以替换?
之前你忽略这个属性是因为AutoMapper默认会尝试从源模型中查找同名属性映射,但源模型里并没有CreateCommentForm,所以会出现问题。现在通过ConstructUsing或MapFrom主动创建实例并赋值,就完全规避了这个问题,同时满足了你的核心需求。
内容的提问来源于stack exchange,提问作者Junior
相关产品推荐
相关产品推荐

