# AutoMapper ###### tags: `實作功能` ## 懶人宣告法 ### Controller ``` public SomeContoller(){ // 讀取所有 Profile !! 少量時可以用,懶起來~ 如果太多有效能問題 IMapper Mapper = new MapperConfiguration(cfg => cfg.AddMaps(Assembly.GetExecutingAssembly())).CreateMapper(); } ``` ### Profile (SomeProfile.cs) ``` internal class SomeProfile : Profile { public SomeProfile() { CreateMap<ViewModel, Model>(); CreateMap<Model, ViewModel>(); } } ``` --- ## ReverseMap 反向(雙向映射) ### 寫法 ``` CreateMap<ViewModel, Model>().ReverseMap(); ``` ### 效果等同於 ``` CreateMap<ViewModel, Model>(); CreateMap<Model, ViewModel>(); ``` ## 針對 EF 需注意: * 針對 EF 的 Class 轉換會有異常,需要每個欄位都配置 * 針對 EF 的清單轉換( Ex. List<AAA> To DBSet<AAA> ) 會有異常,因為 EF 的 DBSet 中有些隱藏欄位 ( Ex. 資料是否有被異動 ... ) ``` IMapper mapper = new MapperConfiguration(cfg => { cfg.AddMapping<VMC_Customer, Customers>() .ForMember(dst => dst.xxx, opt => opt.MapFrom(src => src.yyy)) MapperConfiguration .ForAllOtherMembers void .ForAllMembers(opt => opt.Condition((src, dst, srcMember, dstMember) => srcMember != null)) void; }).CreateMapper(); return mapper.Map<VMC_Customer, Customers>(ViewModel); ``` --- ## 配置過濾 null 的值 ( null 的值就不 mapping 過去 ) ``` .ForAllMembers(opt => opt.Condition((src, dst, srcMember, dstMember) => srcMember != null)); ```