ASP.NET Core Web API 中使用 AutoMapper时 分别对 提交/获取数据做实体映射

   在项目中为了更便捷的去实现 数据库持久化对象(数据库对应的实体) 与 视图对象(传递给页面显示时使用) 间的实体映射。 

  参考的文章中,只提到一种配置映射的方式。例如:

1     public class RoleProfile : Profile {
2         public RoleProfile() {
3             CreateMap<RoleViewModel, Role>(); //dto to entity
4         }
5     }

  说明:Role和RoleViewModel即上文提到的 数据库持久化对象 与 视图对象 

  从映射源和目标可以看出,这是从dto(或者视图对象)中映射到数据库持久化对象。即 提交,更新资源时使用(HttpPost HttpPut),

  当需要获取资源时,需要配置另一个映射:就是从数据库持久化对象中映射到dto(或者视图对象)例如:

  

1  public class RoleProfile : Profile {
2         public RoleProfile() {
3             //entity to dto
4             CreateMap<Role, RoleViewModel>();
5         }
6     }

   一个完整的映射配置如下:

  

 1  public class BloodPressureProfile : Profile {
 2         public BloodPressureProfile() {
 3 
 4             //for entity in(post  put)
 5             CreateMap<BloodPressureViewModel, BloodPressure>()
 6                 .ForMember(dest => dest.BP_Id, t => t.MapFrom(f => f.id))
 7                 .ForMember(dest => dest.BP_Cus_Id, t => t.MapFrom(f => f.cus_id))
 8                 .ForMember(dest => dest.BP_MaxPressure, t => t.MapFrom(f => f.maxpressure))
 9                 .ForMember(dest => dest.BP_MinPressure, t => t.MapFrom(f => f.minpressure))
10                 .ForMember(dest => dest.BP_Pulse, t => t.MapFrom(f => f.pulse))
11                 .ForMember(dest => dest.BP_EquCode, t => t.MapFrom(f => f.equcode))
12                 ;
13             //for entity out (get)
14             CreateMap<BloodPressure, BloodPressureViewModel>().BeforeMap((source, dto) =>
15             {
16                 dto.time = Convert.ToDateTime(source.F_CreatorTime).ToString("yyyy-MM-dd");
17             })
18                .ForMember(dest => dest.id, t => t.MapFrom(f => f.BP_Id))
19                .ForMember(dest => dest.cus_id, t => t.MapFrom(f => f.BP_Cus_Id))
20                .ForMember(dest => dest.maxpressure, t => t.MapFrom(f => f.BP_MaxPressure))
21                .ForMember(dest => dest.minpressure, t => t.MapFrom(f => f.BP_MinPressure))
22                .ForMember(dest => dest.pulse, t => t.MapFrom(f => f.BP_Pulse))
23                .ForMember(dest => dest.equcode, t => t.MapFrom(f => f.BP_EquCode))
24                .ForMember(dest => dest.time, t => t.MapFrom(f => f.F_CreatorTime))
25                ;//end
26         }//end ctor
27     }

  最后:从代码中也可以看出:

  

 1 public async Task<ExecuteResult<RoleViewModel>> Get(long id) {
 2             var result = new ExecuteResult<RoleViewModel>();
 3             var data = await _unitOfWork.GetRepository<Role>().GetFirstOrDefaultAsync
 4                 (predicate: c => c.Id == id);
 5             var returnData = _mapper.Map<RoleViewModel>(data);//泛型类型代表的是 想要的 目标类型 
 6             result.SetData(returnData);
 7             return result;
 8         }
 9 
10         public async Task<ExecuteResult> Update(RoleViewModel viewModel) {
11             ExecuteResult result = new ExecuteResult();
12           
13             if (viewModel.CheckField(ExecuteType.Update, _unitOfWork) is ExecuteResult checkResult && !checkResult.IsSucceed) {
14                 return checkResult;
15             }
16             var entity = _mapper.Map<Role>(viewModel);
17     
18             var row = await _unitOfWork.GetRepository<Role>().FindAsync(viewModel.Id);
19             row.Name = viewModel.Name;
20             row.DisplayName = viewModel.DisplayName;
21             row.Remark = viewModel.Remark;
22             row.Modifier = 1219490056771866624;
23             row.ModifyTime = DateTime.Now;
24             _unitOfWork.GetRepository<Role>().Update(row);
25             await _unitOfWork.SaveChangesAsync();//提交
26             return result;
27         }

  看红色部分代码,完,哈哈哈哈

  

posted @ 2020-05-13 16:52  rhyswang  阅读(346)  评论(0)    收藏  举报