我看到 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)); } } }
1 回答

慕桂英3389331
TA贡献2036条经验 获得超8个赞
简短的回答是,因为我使用的是ProjectTo方法,所以在翻译查询方面,我依赖于 EntityFramework Core 支持的内容。在这一点上,它不支持我试图做的事情。
...
根据上面的评论,我尝试了一些事情。
我尝试从ProjectTo切换到Map,这似乎工作得很好。这是我们决定采用的方法,这样我们就可以消除魔法方法。
我还尝试使用视图而不是存储过程。这也有效,但它让我们的 DBA 非常不高兴。
我还尝试为我的存储过程结果使用查询类型而不是实体类型。这没有区别。如果没有魔术方法,我仍然会得到 NullReference 异常。
- 1 回答
- 0 关注
- 120 浏览
添加回答
举报
0/150
提交
取消