基本问题是,当子实体映射到目标子DTO时,我需要在源父实体上映射到目标子DTO。子实体没有到其父实体的导航属性。如下所示,父级具有子类型的字段。您可以在下面的代码中看到ParentSource具有名为ImageImage类型的TitleImage属性。因此,链接是一个方向。在我的代码中,我到处都使用ImageSource。至少有15个不同的实体,其属性类型为ImageSource。我规范化了我的数据库。 ImageSource实体没有X和Y坐标,因为实际上只有少数几个位置(可能是30个位置中的5个)需要这些额外的值。在那几个地方,如您在ParentSource类上看到的那样,将Title上的X和Y添加到TitleImageX和TitleImageY。
我可以轻松地通过循环来完成我想做的事情,这就是我现在正在做的事情,但是如果可以的话,我很乐意使用Automapper。这样会减少代码。
这是我的课程:
public class ParentSource
{
public string Id { get; set; }
public string Name { get; set; }
public ImageSource HomeImage { get; set; }
public ImageSource TitleImage { get; set; }
//These should be copied to the child object
public int TitleImageX { get; set; }
public int TitleImageY { get; set; }
}
public class ParentDest
{
public string ParentId { get; set; }
public string DisplayName { get; set; }
public ImageDest HomeImage { get; set; }
public ImageDest TitleImage { get; set; }
}
public class ImageSource
{
public string Id { get; set; }
public string Url { get; set; }
public decimal Height { get; set; }
public decimal Width { get; set; }
}
public class ImageDest
{
public string ImageId { get; set; }
public string ImageUrl { get; set; }
public decimal Height { get; set; }
public decimal Width { get; set; }
//Not all images have Coordinate
public decimal XCoordinate { get; set; }
public decimal YCoordinate { get; set; }
}
到目前为止,这是我要做的映射。我不知道如何将X和Y坐标从父级复制到子级。
CreateMap<ParentSource, ParentDest>()
.ForMember(
dest => dest.ParentId,
opt => opt.MapFrom(src => src.Id))
.ForMember(
dest => dest.DisplayName,
opt => opt.MapFrom(src => src.Name));
CreateMap<ImageSource, ImageDest>()
.ForMember(
dest => dest.ImageId,
opt => opt.MapFrom(src => src.Id))
.ForMember(
dest => dest.ImageUrl,
opt => opt.MapFrom(src => src.Url));
感谢您的时间和帮助。
答案 0 :(得分:0)
或者您可以按照自己喜欢的配置(未经尝试或测试)进行操作,但是TitleImage上不会检查是否为空
CreateMap<ParentSource, ParentDest>()
.ForMember(
dest => dest.ParentId,
opt => opt.MapFrom(src => src.Id))
.ForMember(
dest => dest.DisplayName,
opt => opt.MapFrom(src => src.Name))
.ForMember(dest=>dest.TitleImage,
opt=>opt.MapFrom(src=>new ImageDest
{
Width = src.TitleImage.Width,
Height = src.TitleImage.Height,
ImageId = src.TitleImage.Id,
ImageUrl = src.TitleImage.Url,
XCoordinate = src.TitleImageX,
YCoordinate = src.TitleImageY
}
));
答案 1 :(得分:-1)
根据我的收集,您希望X&Y从父级到子级。您可以为此使用转换器类。
转换器:
nameObservable
.pipe(
map(person => {
return giveMeSomeObervable.yourName(person).subscribe(data => data);
})
)
.subscribe(data => console.log(data));
映射:
public class ParentConverter : ITypeConverter<ParentSource, ParentDest>
{
public ParentDest Convert(ParentSource source, ParentDest destination, ResolutionContext context)
{
if (destination == null)
destination = new ParentDest();
destination.DisplayName = source.Name;
destination.ParentId = source.Id;
if (source.TitleImage != null)
{
destination.TitleImage = context.Mapper.Map<ImageDest>(source.TitleImage);
destination.TitleImage.XCoordinate = source.TitleImageX;
destination.TitleImage.YCoordinate = source.TitleImageY;
}
return destination;
}
}