为了账号安全,请及时绑定邮箱和手机立即绑定

AutoMapper:直接映射到子对象目标字段未按预期工作

AutoMapper:直接映射到子对象目标字段未按预期工作

C#
慕雪6442864 2022-11-13 14:28:03
我看到 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 异常。


查看完整回答
反对 回复 2022-11-13
  • 1 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号