# 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));
```