AutoMapper反向映射嵌套嵌入对象不生效问题咨询
问题描述
有一个名为Affaire的类,其关联的Secteur类下包含多个对应的Emplacement对象,需要用AutoMapper实现这些业务对象和对应DTO对象的转换。
相关类定义如下:
public class Affaire { public string Nom { get; set; } } public class Emplacement { public int AffaireId { get; set; } public Affaire Affaire { get; set; } } public class EmplacementDTO { public int AffaireId { get; set; } public string AffaireNom { get; set; } }
Emplacement对象会被归类到Secteur中,Secteur类本身也关联了对应的Affaire对象:
public class Secteur { public int AffaireId { get; set; } public Affaire Affaire { get; set; } public IList<Emplacement> Emplacements { get; set; } = new List<Emplacement>(); }
从Emplacement映射到EmplacementDTO时,不需要携带完整的Affaire对象,仅需要AffaireId属性,因此做了如下配置:
CreateMap<Emplacement, EmplacementDTO>() .ForMember(dto => dto.AffaireId, o => o.MapFrom(dto => dto.Affaire.Id)) .ForMember(dto => dto.AffaireNom, o => o.MapFrom(dto => dto.Affaire.Nom)) .ReverseMap() .ForPath(bo => bo.Affaire, o => o.MapFrom(dto => (Affaire)null)); // <<<< 问题点
但上述配置在Emplacement作为SecteurDTO的嵌入对象进行映射时似乎不生效,不过Secteur自身的映射配置是正常工作的,它的Affaire属性可以被正确设置为null:
CreateMap<Secteur, SecteurDTO>() .ForMember(dto => dto.AffaireId, o => o.MapFrom(dto => dto.Affaire.Id)) .ForMember(dto => dto.AffaireNom, o => o.MapFrom(dto => dto.Affaire.Nom)) .ReverseMap() .ForPath(bo => bo.Affaire, o => o.MapFrom(dto => (Affaire)null))

解决方案
根因说明
你配置的MapFrom(dto => (Affaire)null)规则仅在EmplacementDTO单独映射到Emplacement时生效,当Emplacement作为Secteur的嵌套集合元素进行反向映射时,AutoMapper默认会根据外键AffaireId自动尝试填充导航属性Affaire,主动设null的规则会被自动关联逻辑覆盖,因此不生效。
修复步骤
1. 修改Emplacement的映射配置
将主动设null改为直接忽略Affaire属性映射,避免自动填充逻辑覆盖规则:
CreateMap<Emplacement, EmplacementDTO>() .ForMember(dto => dto.AffaireId, o => o.MapFrom(bo => bo.Affaire.Id)) .ForMember(dto => dto.AffaireNom, o => o.MapFrom(bo => bo.Affaire.Nom)) .ReverseMap() // 忽略Affaire导航属性的映射,默认值即为null .ForMember(bo => bo.Affaire, o => o.Ignore());
2. 可选补充配置
如果修改完Emplacement的配置后嵌套映射还是不生效,可以在Secteur的反向映射中显式指定集合的映射逻辑,强制应用Emplacement的映射规则:
CreateMap<Secteur, SecteurDTO>() .ForMember(dto => dto.AffaireId, o => o.MapFrom(bo => bo.Affaire.Id)) .ForMember(dto => dto.AffaireNom, o => o.MapFrom(bo => bo.Affaire.Nom)) .ReverseMap() .ForPath(bo => bo.Affaire, o => o.Ignore()) // 显式指定嵌套集合使用已配置的Emplacement映射规则 .ForPath(bo => bo.Emplacements, o => o.MapFrom(dto => dto.Emplacements));
内容的提问来源于stack exchange,提问作者serge
相关产品推荐
相关产品推荐

