.Net Core使用AutoMapper做对象关系映射

我想很多后端开发者,纠结于如何在Dto及表实体中做属性关系映射,因为真的太繁琐了。,

⒈如何使用?

1             Mapper.Initialize(cfg => cfg.CreateMap<UsersInputDto, Users>());
2             UsersInputDto input = new UsersInputDto()
3             {
4                 id = 1, firstname = "fan", lastname = "qi", uname = "fanqisoft", pwd = "admin", enabled = 1
5             };
6             Users user = Mapper.Map<Users>(input);

⒉映射前或映射后进行操作

  首先附上实体类

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4
 5 namespace AutoMapperTest.Entities
 6 {
 7     public class Users
 8     {
 9         public int id { get; set; }
10         public string fullname { get; set; }
11         public int? age { get; set; }
12         public string username { get; set; }
13
14         public string password { get; set; }
15         public int? enabled { get; set; }
16
17         public override string ToString()
18         {
19             return $"用户ID:{this.id} \n用户姓名:{this.fullname}\n用户名:{this.username} \n用户密码:{this.password} \n用户是否启用:{(this.enabled==1?‘是‘:‘否‘)}";
20         }
21     }
22 }

  InputDto

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4
 5 namespace AutoMapperTest.Entities
 6 {
 7     public class UsersInputDto
 8     {
 9         public int id { get; set; }
10         public string firstname { get; set; }
11         public string lastname { get; set; }
12         public int? age { get; set; }
13         public string uname { get; set; }
14
15         public string pwd { get; set; }
16         public int? enabled { get; set; }
17     }
18 }

  

  当前端InputDto传到后端时,我需要将Dto中的firstname及lastname合并转换为数据表中的fullname

1             Mapper.Initialize(cfg =>
2             {
3                 cfg.CreateMap<UsersInputDto, Users>().BeforeMap((dto, ent) => ent.fullname = dto.firstname + "_" + dto.lastname);
4             });

⒊条件映射,必须必要的条件后才会映射属性。

1             Mapper.Initialize(cfg =>
2             {
3                 cfg.CreateMap<UsersInputDto, Users>().ForMember(d => d.age, u => u.Condition(s => s.age >= 0 && s.age <= 120));
4             });

⒋属性对应映射,Dto中属性名  != 数据表属性名

1             Mapper.Initialize(cfg =>
2             {
3                 cfg.CreateMap<UsersInputDto, Users>().ForMember(d => d.username, u => u.MapFrom(s => s.uname))
4                                                      .ForMember(d => d.password, u => u.MapFrom(s => s.pwd));
5             });

⒌使用配置文件?实现Profile类并在构造器中初始化你的配置。

 1 using AutoMapper;
 2 using AutoMapperTest.Entities;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Text;
 6
 7 namespace AutoMapperTest.AutoMapper
 8 {
 9     public class AutoMapperConfig:Profile
10     {
11         public AutoMapperConfig()
12         {
13             CreateMap<UsersInputDto, Users>();
14         }
15     }
16 }
1             Mapper.Initialize(cfg =>
2             {
3                 cfg.CreateMap<UsersInputDto, Users>().ForMember(d => d.username, u => u.MapFrom(s => s.uname))
4                                                      .ForMember(d => d.password, u => u.MapFrom(s => s.pwd));
5                 cfg.AddProfile<AutoMapperConfig>();   //添加一个配置文件
6             });

⒍Dto中数据类型和数据表不一致那就自定义转换器吧。

 1 using AutoMapper;
 2 using AutoMapperTest.Entities;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Text;
 6
 7 namespace AutoMapperTest.AutoMapper
 8 {
 9     public class UsersConverter:ITypeConverter<Users,UsersOutputDto>
10     {
11         public UsersOutputDto Convert(Users source, UsersOutputDto destination, ResolutionContext context)
12         {
13             string[] names = source.fullname.Split("_");
14             return new UsersOutputDto()
15             {
16                 id = source.id,
17                 firstname = names[0],
18                 lastname = names[1]
19             };
20         }
21     }
22 }
1             Mapper.Initialize(cfg =>
2             {
3                 cfg.CreateMap<Users, UsersOutputDto>().ConvertUsing<UsersConverter>();
4             });
5             Users users = new Users()
6             {
7                 id = 1, fullname = "fan_qi",age = 25,username = "fanqisoft",password ="admin",enabled = 1
8             };
9             UsersOutputDto output = Mapper.Map<UsersOutputDto>(users);

⒎附一个可用的静态工具类

 1 using AutoMapper;
 2 using System;
 3 using System.Collections;
 4 using System.Collections.Generic;
 5 using System.Data;
 6 using System.Text;
 7
 8 namespace AutoMapperTest.AutoMapper
 9 {
10     /// <summary>
11     /// AutoMapper扩展帮助类
12     /// </summary>
13     public static class AutoMapperHelper
14     {
15         /// <summary>
16         /// 类型映射
17         /// </summary>
18         /// <typeparam name="T"></typeparam>
19         /// <param name="obj"></param>
20         /// <returns></returns>
21         public static T MapTo<T>(this object obj)
22         {
23             if(obj == null)
24             {
25                 return default(T);
26             }
27             Mapper.Initialize(cfg =>
28             {
29                 cfg.CreateMap(obj.GetType(), typeof(T));
30             });
31             return Mapper.Map<T>(obj);
32         }
33
34         /// <summary>
35         /// 集合列表类型映射
36         /// </summary>
37         public static List<TDestination> MapToList<TDestination>(this IEnumerable source)
38         {
39             foreach (var first in source)
40             {
41                 var type = first.GetType();
42                 Mapper.Initialize(cfg =>
43                 {
44                     cfg.CreateMap(type, typeof(TDestination));
45                 });
46                 break;
47             }
48             return Mapper.Map<List<TDestination>>(source);
49         }
50         /// <summary>
51         /// 集合列表类型映射
52         /// </summary>
53         public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source)
54         {
55             //IEnumerable<T> 类型需要创建元素的映射
56             Mapper.Initialize(cfg =>
57             {
58                 cfg.CreateMap<TSource, TDestination>();
59             });
60             return Mapper.Map<List<TDestination>>(source);
61         }
62         /// <summary>
63         /// 类型映射
64         /// </summary>
65         public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
66                     where TSource : class
67                     where TDestination : class
68         {
69             if (source == null) return destination;
70             Mapper.Initialize(cfg =>
71             {
72                 cfg.CreateMap<TSource, TDestination>();
73             });
74             return Mapper.Map(source, destination);
75         }
76         /// <summary>
77         /// DataReader映射
78         /// </summary>
79         public static IEnumerable<T> DataReaderMapTo<T>(this IDataReader reader)
80         {
81             Mapper.Reset();
82             Mapper.Initialize(cfg =>
83             {
84                 cfg.CreateMap<IDataReader, IEnumerable<T>>();
85             });
86             return Mapper.Map<IDataReader, IEnumerable<T>>(reader);
87         }
88     }
89 }

  

原文地址:https://www.cnblogs.com/fanqisoft/p/10798007.html

时间: 2024-08-01 14:41:00

.Net Core使用AutoMapper做对象关系映射的相关文章

Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的,不是我们三言两语就能解决的,我一直想抽个时间自己再过一遍Sqlite和JDBC的,但是,大家也知道,琐事比较多,我们来说一下数据库的框架吧,事实上市面上,我觉得还可以的数据库框架有两个,ORMLite和GreenDao,我以前做的运动类的应用上,就需要存储大量的运动数据,我们最开始是在本地写数据库的

Hibernate(开放源代码的对象关系映射框架)

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久

ORM(Object-Relational Mapping 对象关系映射)如何实现(转)

原文链接:http://blog.163.com/hzd_love/blog/static/13199988120107891854473/ 1.什么是ORM ORM的全称是Object Relational Mapping,即对象关系映射.它的实现思想就是将关系数据库中表的数据映射成为对象,以对象的形式展现,这样开发人员就可以把对数据库的操作转化为对这些对象的操作.因此它的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作. 2.什么是Hibernate 对于Hibernate的称呼有

ORM即 对象-关系映射(转自:微冷的雨)

ORM即 对象-关系映射: 将数据库中的数据关系表,映射为实体对象. 灵动思绪EF(Entity FrameWork) 作者: 微冷的雨  来源: 博客园  发布时间: 2013-01-22 16:28  阅读: 10119 次  推荐: 16   原文链接   [收藏] 很久之前就想写这篇文章了,但是由于种种原因,没有将自己学习的EF知识整理成一片文章.今天我就用CodeFirst和ModelFirst两种方式的简单案例将自己学习的EF知识做个总结. 在讲解EF之前,我们先来看下ORM ORM

Hibernate之配置文件以及对象关系映射文件了解

声明:CSDN不知道怎么了,有时候就是发表不了博文.本来就是一天一篇博文,最近搞的我很郁闷.有时候一天,有时候两三天都不能发.这就属于不可抗力.没办法的,啥时能发,我就发了. 一.学习案例:关于hibernate的配置文件以及对象关系映射文件的了解. 二.案例分析: a)hibernate配置文件(hibernate.cfg.xml) 1.hibernate.dialect:数据库使用的SQL方言 2.hiebrnate.connection.driver_class:数据库的驱动程序 3.hi

Hibernate的核心对象关系映射

Hibernate的核心就是对象关系映射: (1)第一掌握映射文件的书写: <hibernate-mapping package="com.bie.po"> </hibernate-mapping> (2)第二掌握如何映射某一个对象,以及class里面主键和普通字段的设置. <class name="User" table="user"> 注意:property的column属性的值不能是sql语句的关键字,比

持久化和对象关系映射

持久化:持久(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘文件.XML文件等).持久化的主要应用是将内存中的数据存储在关系型的数据库中,当然也可以存储在磁盘文件中.XML数据文件中等等. 持久层:主要实现数据持久化应用领域的某个特定系统的一个逻辑层面,将数据使用者和数据实体相关联. 对象数据映射(ORM):Object/Relational Mapper,即“对象-关系型数据映射组件”.对于O/R,即 Object(对象)和 Relational(关系

LLBL Gen Pro 4.2 Lite 免费的对象关系映射开发框架与工具

LLBL Gen Pro是一款优秀的对象关系映射开发框架,自2003年发布以来,一直有广泛的客户群.LLBL Gen Pro有几个标志性的版本,2.5/2.6是一个很稳定的版本,公司的一些旧的项目仍然用的是这个版本.3.1 将项目的文件改成XML格式(llblgenproj),极大的方便和简化了第三方工具与LLBL Gen交互,我的项目中用到的代码生成模板即使借助于解析它的XML格式文件,生成接口与实现文件.3.1也修改了生成实体的参数的顺序.比如2.5/2.6版本的送货单明细实体的代码如下:

Php ORM 对象关系映射

ORM的全称是Object Relational Mapping,即对象关系映射.它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程.在ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离.从面向对象来说,数据库不应该和业务逻辑绑定到一起,ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象.图 1简单说明了ORM在多层系统架构中的这个作用