我看到 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 關注
- 118 瀏覽
添加回答
舉報
0/150
提交
取消