繁体   English   中英

AutoMapper,将一种类型映射到两种不同的类型

[英]AutoMapper, mapping one type in two different types

我有以下型号:

public class Stuff
{
    ...
    public IList<Place> Places { get; set; } = null!;
    ...
}

public class Place
{
    ...
    public IList<Stuff> Stuffs { get; set; } = null!;
    ...
}

public class StuffEntity 
{
    ...
    public IList<PlaceStuffEntity> Places { get; set; } = null!;
    ...
}

public class PlaceEntity 
{
    ...
    public IList<PlaceStuffEntity> Stuffs { get; set; } = null!;
    ...
}

public class PlaceStuffEntity
{
    public int StuffId { get; private set; }
    public StuffEntity Stuff { get; set; } = null!;
    public int PlaceId { get; private set; }
    public PlaceEntity Place { get; set; } = null!;
}

cfg.CreateMap<StuffEntity, Stuff>()
   .ForMember(d => d.Places,
              opt => opt.MapFrom(s => s.Places.Select(y => y.Place).ToList()));
cfg.CreateMap<PlaceEntity, Place>()
   .ForMember(d => d.Stuffs,
              opt => opt.MapFrom(s => s.Places.Select(y => y.Stuff).ToList()));
cfg.CreateMap<PlaceAndStuffEntity, Stuff>()              // < -- Issue
   .IncludeMembers(entity=> entity.Stuff);
cfg.CreateMap<PlaceAndStuffEntity, Place>()              // < -- Issue
   .IncludeMembers(entity=> entity.Place);

由于某种原因,当我添加最后两行时,转换不起作用......

但是,如果我只添加一行,例如用于转换PlaceAndStuffEntity -> Stuff仅适用于PlaceEntity -> Place一种转换

var place = mapper.Map<Place>(placeEntity); // <- This works
var stuff = mapper.Map<Stuff>(stuffEntity); // <- Does not work !!

有没有办法正确处理以下转换?

听起来您想通过连接表 (PlaceAndStuff) 映射到其他实体类型。 例如,在您的 Place 中获取 Stuff 列表,Stuff 中获取 Place 列表,您希望指示 Automapper 如何在连接表中导航。

例如:

cfg.CreateMap<StuffEntity, Stuff>()             
   .ForMember(x => x.Places, opt => opt.MapFrom(src => src.PlaceEntity));
// Where StuffEntity.Places = PlaceAndStuffEntities, to map Stuff.Places use PlaceAndStuffs.PlaceEntity

cfg.CreateMap<PlaceEntity, Place>()             
   .ForMember(x => x.Stuffs, opt => opt.MapFrom(src => src.StuffEntity));

因此,与其试图告诉 EF 如何映射连接实体 PlaceStuffEntity,我们专注于 PlaceEntity 和 StuffEntity,并告诉 Automapper 导航连接实体以通过连接实体获取实际的 Stuff 和 Place 亲属。

改变

cfg.CreateMap<PlaceEntity, Place>()
   .ForMember(d => d.Stuffs,
              opt => opt.MapFrom(s => s.Places.Select(y => y.Stuff).ToList()));

cfg.CreateMap<PlaceEntity, Place>()
   .ForMember(d => d.Stuffs,
              opt => opt.MapFrom(s => s.Stuffs.Select(y => y.Stuff).ToList()));

源类型 PlaceEntity 没有名为 Places 的属性,只有 Stuffs。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM