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

时间:2020-09-09 19:23:38

标签: c# entity-framework entity-framework-core automapper

我有以下型号:

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 !!

是否可以正确处理以下转换?

2 个答案:

答案 0 :(得分:0)

听起来您想通过联接表(PlaceAndStuff)映射到其他实体类型。例如,在您的位置中获取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亲戚。 / p>

答案 1 :(得分:0)

更改

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。