【问题标题】:AutoMapper, the reverse map not working for embedded objects?AutoMapper,反向映射不适用于嵌入式对象?
【发布时间】: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,我无法重现该问题,请分享您的整个模型设计。

标签: c# asp.net-core-mvc mapping automapper .net-5


【解决方案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...所以可能自动映射器工作正常,或者不能,我无法测试,但是如果您的样品工作正常。然而,重要的是要查看之前(事务不为空)和之后(事务为空)的对象状态
猜你喜欢
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
相关资源
最近更新 更多