如何使用AutoMap将属性映射到子属性的属性?附数据模型示例
使用AutoMapper实现实体到子属性的映射
没问题,这在AutoMapper里是非常常见的场景,我来给你一步步拆解实现方式:
首先明确需求:你需要把Person实体中嵌套的Address对象的属性,映射到PersonViewModel的平级属性中(比如把Person.Address.Street映射到PersonViewModel.Street)。
第一步:准备视图模型(必要前提)
首先确保你的PersonViewModel包含需要映射的Address相关属性,比如:
public class PersonViewModel { public string FirstName { get; set; } public string LastName { get; set; } // 添加Address对应的平级属性 public string Street { get; set; } public string City { get; set; } public string State { get; set; } public string ZipCode { get; set; } // 其他属性 }
第二步:配置AutoMapper映射
AutoMapper提供了两种常用方式实现这种嵌套属性到平级的映射:
方式一:显式配置每个子属性(直观易懂,适合属性不多的场景)
直接通过ForMember方法指定每个目标属性的来源,这种方式灵活性最高:
// 创建映射配置 var config = new MapperConfiguration(cfg => { cfg.CreateMap<Person, PersonViewModel>() // 映射Person自身的基础属性 .ForMember(dest => dest.FirstName, opt => opt.MapFrom(src => src.FirstName)) .ForMember(dest => dest.LastName, opt => opt.MapFrom(src => src.LastName)) // 映射Address的嵌套属性到ViewModel的平级属性 .ForMember(dest => dest.Street, opt => opt.MapFrom(src => src.Address?.Street)) .ForMember(dest => dest.City, opt => opt.MapFrom(src => src.Address?.City)) .ForMember(dest => dest.State, opt => opt.MapFrom(src => src.Address?.State)) .ForMember(dest => dest.ZipCode, opt => opt.MapFrom(src => src.Address?.ZipCode)); }); // 推荐验证配置是否正确(避免映射遗漏或错误) config.AssertConfigurationIsValid(); // 创建映射器实例 var mapper = config.CreateMapper();
这里用?.空条件运算符是为了防止Person.Address为null时出现空引用异常,非常实用!
方式二:利用AutoMapper的扁平化约定(减少配置代码)
如果你的PersonViewModel属性命名遵循**[父属性名][子属性名]**的规则(比如AddressStreet、AddressCity),AutoMapper会自动识别并映射,无需手动配置每个ForMember:
先修改ViewModel的属性名:
public class PersonViewModel { public string FirstName { get; set; } public string LastName { get; set; } // 遵循AutoMapper扁平化命名约定 public string AddressStreet { get; set; } public string AddressCity { get; set; } public string AddressState { get; set; } public string AddressZipCode { get; set; } // 其他属性 }
然后只需要简单创建映射即可:
var config = new MapperConfiguration(cfg => { // AutoMapper会自动识别扁平化命名的属性,无需额外配置 cfg.CreateMap<Person, PersonViewModel>(); });
第三步:执行映射
配置完成后,就可以轻松完成实体到视图模型的映射了:
// 模拟一个Person实例 var person = new Person { FirstName = "Mohammed", LastName = "Noureldin", Address = new Address { Street = "456 Oak Ave", City = "New York", State = "NY", ZipCode = "67890" } }; // 执行映射 var viewModel = mapper.Map<PersonViewModel>(person);
额外提示:EF Core场景下的投影优化
如果你的数据来自EF Core数据库,还可以用AutoMapper的ProjectTo方法直接在数据库查询时完成投影,这样能避免加载不必要的属性,提升查询性能:
// 假设你有DbContext实例 var viewModel = dbContext.Persons .Where(p => p.FirstName == "Mohammed") .ProjectTo<PersonViewModel>(config) .FirstOrDefault();
内容的提问来源于stack exchange,提问作者Mohammed Noureldin
相关产品推荐
相关产品推荐

