AutoMapper
Posted 生命不息bug不止
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AutoMapper相关的知识,希望对你有一定的参考价值。
AutoMapper自动映射规范
两个类之间自动映射时,这两个类的属性名称和类型必须相同
public class Student() { public long StudentId{get;set;} public string StudentName{get;set;} } public class StudentDto() { public long StudentId{get;set;} public string StudentName{get;set;} }
如果一个类中存在包含关系,另一个类要自动映射两个类时,映射类属性命名要在被包含类属性名的基础上加上被包含类的类名
public class Student() { public long StudentId{get;set;} public string StudentName{get;set;} public Class class{get;set;} } public class Class() { public long Id{get;set;} public string Name{get;set;} } public class StudentDto() { public long StudentId{get;set;} public string StudentName{get;set;} public long ClassId{get;set;} public string ClassName{get;set;} }
注册一个映射关系
Mapper.Initialize(d=>d.CreateMap<源类型,目标类型>());
反向映射
创建之后更改目标类型,会反过来映射到源类型
ReverseMap方法
Mapper.Initalize(d=>d.CreateMap<源类型,目标类型>().ReverseMap()); var dto = Mapper.Map<StudentDto>(models); dto.StudentName = "张三";//把目标类型值改变 Mapper.Map(dto,models);//反向映射
配置验证
automapper默认是检查所有属性是否可以映射
AssertConfigurationlsValid方法用来验证是否可以全部映射,如果不能则会报错
Mapper.Configuration.AssertConfigurationlsValid();
当我们的属性不能全部映射,但又不想报错时,可以使用Ignore方法来忽略掉 无法映射 or 不需要映射 的属性
Mapper.Initalize(d=>d.CreateMap<源类型,目标类型>().forMember(d=>d.Name,s=>s.Ignore())); //忽略Name属性
我们也可以在createmap时指定要验证的成员列表
Mapper.Initalize(d=>d.CreateMap<源类型,目标类型>(MemberList.StudentDTO));//只验证StudentDTO类的属性 //如果两个类都不需要检查,加上MemberList.None即可
automapper配置了两个类型的映射后,这两个类型的集合或数组都可以直接映射,无需再次配置
Mapper.Initalize(d=>d.CreateMap<源类型,目标类型>()); var dto = Mapper.Map<List<目标类型>>(List<源类型>);
automapper还可以映射子类,但是需要配置
Mapper.Initalize(d=>{ d.CreateMap<源类型,目标类型>().Include<源子类型,目标子类型>(); d.CreateMap<源子类型,目标子类型>(); }); 源类型 model = new []{ new 源类型(); new 源子类型(); } 目标类型 DTO = Mapper.Map<目标类型[]>(model); //源类型会被映射为目标类型 //源子类型会被映射为目标子类型
第一行是配置子类和父类的关系,第二行是配置子类之间的映射
以上是关于AutoMapper的主要内容,如果未能解决你的问题,请参考以下文章