AutoMapper,反向映射不适用于嵌入式对象?

Posted

技术标签:

【中文标题】AutoMapper,反向映射不适用于嵌入式对象?【英文标题】:AutoMapper, the reverse map not working for embedded objects? 【发布时间】:2021-08-11 10:23:03 【问题描述】:

我有一个类Affaire,包含Secteurs,包含关联的Emplacements,以及要转换的相应DTO 对象。我为此使用AutoMapper

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; 

Emplacements 分组在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)); // <<<< HERE

当 Emplacement 嵌入到容器 SecteurDTO 中时,此配置似乎不起作用,但是,对于容器本身,配置似乎起作用(其 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))

相关问题here

【问题讨论】:

嗨@Serge,我无法重现该问题,请分享您的整个模型设计。 【参考方案1】:

这是我项目中的工作演示:

型号:

public class Affaire

    public int Id  get; set; 
    public string Nom  get; set; 
    public IList<Emplacement> Emplacements  get; set;  = new List<Emplacement>();

public class Emplacement

    public int AffaireId  get; set; 
    public Affaire Affaire  get; set; 


public class Secteur

    public int AffaireId  get; set; 
    public Affaire Affaire  get; set; 
    public IList<Emplacement> Emplacements  get; set;  = new List<Emplacement>();

DTO:

public class EmplacementDTO

    public int AffaireId  get; set; 
    public string AffaireNom  get; set; 
    public Affaire Affaire  get; set; 

public class SecteurDTO

    public int AffaireId  get; set; 
    public string AffaireNom  get; set; 
    public Affaire Affaire  get; set; 
    public IList<EmplacementDTO> Emplacements  get; set; 

简介:

public class YourProfile : Profile


    public YourProfile()
    
        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));

        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));
    


后端测试代码:

public List<EmployeeModel> Index(List<SecteurDTO> dto)

    dto = new List<SecteurDTO>()
    
        new SecteurDTO()
            AffaireId=1,
            AffaireNom="aaa",
            Emplacements = new List<EmplacementDTO>()
            
                new EmplacementDTO()AffaireId=1,Affaire=new Affaire()Id=1,Nom="aa"
            ,
            Affaire=new Affaire()
                Id=1,
                Nom="aaa",
                Emplacements=new List<Emplacement>()
                
                    new Emplacement()AffaireId=1,Affaire=new Affaire()Id=1,Nom="aa"
                
            
        
    ;
    var bo= new List<Secteur>()  ;

    var mapper = _mapper.Map(dto, bo);

    //...

结果:

【讨论】:

不确定会发生什么,我删除了一些 EF 对象加载,根本不加载 Affaire,只有 Ids...所以可能自动映射器工作正常,或者不能,我无法测试,但是如果您的样品工作正常。然而,重要的是要查看之前(事务不为空)和之后(事务为空)的对象状态

以上是关于AutoMapper,反向映射不适用于嵌入式对象?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core 中的对象映射之 AutoMapper

用于封装的 AutoMapper 和嵌套对象映射

AutoMapper的使用

.NET开发应该了解的10个库

1.AutoMapper简单介绍

对象映射工具AutoMapper介绍