我看到 AutoMapper 有一些奇怪的行为,当目标字段位于子对象中时,我无法直接映射源字段和目标字段。相反,我需要将源字段包装在方法调用中,该方法调用检查该字段是否为空。如果不为null,则返回该值,否则返回null。不得不这样做似乎是不对的。特别是因为映射到根对象上的目标字段不需要这种黑客攻击。
公平地说,我不确定问题出在 AutoMapper 上。可能是 EntityFramework Core 的问题。但是,从表面上看,它看起来像是一个 AutoMapper 问题。
由于对知识产权的担忧,如果问题被发现,我无法分享代码。因此,我编写了一个工作示例,它尽可能接近原始代码,并且显示出相同的问题。它可以在https://github.com/BurikkuDeibu/BrickApi找到。主分支有我认为应该的代码。UseMagicMethods分支具有使事情正常进行所需的黑客代码。UseMagicMethods分支中真正感兴趣的文件是https://github.com/BurikkuDeibu/BrickApi/blob/UseMagicMethods/src/WebApi/Models/ElementDetailsMapper.cs
从主分支(抛出异常):
public class ElementDetailsMapper
{
public class ElementDetailsProfile : Profile
{
public ElementDetailsProfile()
{
CreateMap<ElementDetailEntity, RGBDetail>()
.ForMember(dest => dest.R, opts => opts.MapFrom(src => src.Red))
.ForMember(dest => dest.G, opts => opts.MapFrom(src => src.Green))
.ForMember(dest => dest.B, opts => opts.MapFrom(src => src.Blue));
CreateMap<ElementDetailEntity, ColorDetail>()
.ForMember(dest => dest.RGB, opts => opts.MapFrom(src => src))
.ForMember(dest => dest.Id, opts => opts.MapFrom(src => src.ColorId))
.ForMember(dest => dest.Name, opts => opts.MapFrom(src => src.Color))
.ForMember(dest => dest.IsTranparent, opts => opts.MapFrom(src => src.Transparent))
.ForMember(dest => dest.IsMetaliic, opts => opts.MapFrom(src => src.Metallic));
CreateMap<ElementDetailEntity, DesignDetail>()
.ForMember(dest => dest.Id, opts => opts.MapFrom(src => src.DesignId))
.ForMember(dest => dest.Name, opts => opts.MapFrom(src => src.Design));
}
}
}
慕桂英3389331
相关分类