【问题标题】:Automapper, map a property that is on the many to many tableAutomapper,映射多对多表上的属性
【发布时间】:2021-04-06 19:34:09
【问题描述】:

我正在开发一个 .NET 5 API

我必须用一个序列化 UnitDto 类的 Json 回复 get 调用,并在其中包含所有 InstDto 类的列表,但我需要一个驻留的属性UnitInst 对象(多对多表)

我的课:

public class Unit
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public virtual ICollection<UnitInst> UnitInsts { get; set; }
}

public class Inst
{
    public long Id { get; set; }
    public string Name { get; set; }

    public virtual ICollection<UnitInst> UnitInsts { get; set; }
}

public class UnitInst
{
    public long Id { get; set; }
    public long UnitId { get; set; }
    public virtual Unit Unit { get; set; }
    public long InstId { get; set; }
    public virtual Inst Inst { get; set; }
    public string IPv4 { get; set; } // the property that is important
}

我的 dto 的

public class UnitDto
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

    public IEnumerable<InstDTO> Insts { get; set; }
}

public class InstDTO
{
    public long Id { get; set; }
    public string Name { get; set; }
    public string IPv4 { get; set; } // I need serialize this property in my response json
}

我以这种方式映射,没关系,但我无法从 UnitInst 类(多对多表)中检索 IPv4 属性

CreateMap<Unit, UnitDto>()
    .ForMember(dto => dto.Insts, opt => opt.MapFrom(x => x.UnitInsts.Select(y => y.Inst).ToList()))
    .PreserveReferences();

我该如何解决?

【问题讨论】:

  • 这里缺少一些信息。有InstInstrument,还有UnitInstUnitInstrument。这两对是一回事吗?
  • @Dialectus 对不起,我的错误我已经更新了问题,这里只存在 Inst 类

标签: c# asp.net-core entity-framework-core automapper asp.net5


【解决方案1】:

通常您会创建 2 个地图(Unit -> UnitDtoInst -> InstDto)并使用您展示的 Select 技巧。但这仅适用于连接实体没有附加数据的情况,此处并非如此。

所以需要直接映射join实体集合:

CreateMap<Unit, UnitDto>()
    .ForMember(dst => dst.Insts, opt => opt.MapFrom(src => src.UnitInsts)); // <-- no Select

并创建额外的地图UnitInst -> InstDto:

cfg.CreateMap<UnitInst, InstDTO>()
    .IncludeMembers(src => src.Inst) // needs `Inst` -> `InstDTO` map
    .ForMember(dst => dst.Id, opt => opt.MapFrom(src => src.Inst.Id));

这里 AutoMapper IncludeMembers 用于映射由常规 Inst -> InstDTO 映射指定的 Inst 成员,并且目标 Id 属性被显式映射,因为源和“包含”对象都有具有相同名称的属性,在这种情况下源具有优先级,但您希望 IdInst.IdInstId

最后是Inst -> InstDTO 地图:

CreateMap<Inst, InstDTO>()
    .ForMember(dst => dst.IPv4, opt => opt.Ignore());

【讨论】:

    猜你喜欢
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    相关资源
    最近更新 更多