.Net Core2.2 使用 AutoMapper进行实体转换
一、遇到的问题
在. Core Api 的编写中,我们经常会对一些功能点进行新增编辑操作,同时我们有时也会进行查询,但是我们查询的表的数据与我们返回的数据相差甚大,这是我们有需要自己手动进行类型的转换,去输出我们需要的类型。在添加和修改的时候我们也是需要传入A类型然后转换成我们需要的B类型去进行数据库的添加。其中我们就会写许多的简单重复代码,但是又不能不写。那么我们如何去避免这种情况呢?下面介绍的AutoMapper进行对象映射,可以很方便快捷的帮助我们解决这个问题。
二、AutoMapper介绍及安装配置
本次案例使用的是.Net Core 2.2和AutoMapper(8.0.0)以及AutoMapper.Extensions.Microsoft.DependencyInjection(6.0.0)。在我们安装Nuget包之后我们需要创建一个配置类来继承AutoMapper的Profile类,这里我们暂且命名是MapperConfig,同时我们还需要在Startup.cs中注入AutoMapper和刚刚我们创建MapperConfig文件。
我们在使用Mapper的时候我们可以选择使用依赖注入到控制器中使用,也可以直接using引用使用
到这里我们基础的配置就算好了,那我们一起看下我们怎么去使用AutoMapper进行实体映射转换吧。
三、详细使用介绍
- 1. 一对一的对应字段实体转换
我们看到上面就是我们需要转换的实体类和Dto了,对于简单这种转换我们,我们需要在Mapper配置文件中创建一个对应转换关系,然后一行代码进行转换。
- 2. 一对一不对应字段转换
上面我们转换对象都是一对一的转换,都有对应的转换关系。那么我们在实体和Dto中有不对应的关系时我们该如何转换呢?
就如这样,我们将实体类User转换UserAppointModel类,我们该如何转换呢?如果我们通过第一种转换方式的话,我们会发现Time这个字段是空的,这里我们就需要加额外的配置了,保证User的CreateTime字段可以转换成UserAppointModel的Time字段。
这里我们使用的是ForMember(),它是对单个成员进行自定义配置的一个方法,也就是说如果还有其他的不对应字段我们依然可以在后面进行自定义配置,使其对应转换。
- 3. 多表对应一个Dto进行转换
我们除了遇到一对一简单转换和特殊字段转换外,我们有时还会遇到多对一的实体转换,例如我们有些时候在Api返回的时候需要对主表和副表的数据进行整合返回成一个实体。这种情况我们怎么返回呢?现在我们看下面的这个案例:
我们需要把User实体和UserInfo实体转换成UserInfoModel进行输出。逻辑还是这个逻辑,我们需要先转换一个实体,然后在前一个实体的基础上进行另外一个实体转换。那么能不能连续Map两次呢?想法是这个想法,可惜在AutoMapper原有基础上不支持这种写法,不过我们可以重写其方法达到这种效果。
这里我们可以先创建一个非泛型静态类MapperTest,然后我们在里面写下以下方法:
这就是我们重写方法了,这样也就可以实现我们上面的想法了。在第一次转换的基础上进行第二转换,也就实现了多对一的转换了。
- 4. 集合对应转换
我们如何进行集合对集合的转换呢?集合与集合之间的转换呢与之前的一对一转换类似,只是我们转换的时候传的类型不是实体,而是List<>集合而已。下面看下User集合转换成UserModel集合的案例:
四、写在后面
在平常的代码中,我们经常会写一些重复的简单代码,如创建,修改输出实体转换。都是new实体一个一个转换去写,偶尔写那么一两个也还行,写的多了就有点浪费时间和精力了。本文介绍的是在.Net Core2.2中使用AutoMapper进行实体映射转换的,下一篇将介绍.Net Core3.0 AutoMapper9.0的使用与.Net Core2.2中的差别。
用爱生活,你会使自己幸福!用爱工作,你会使很多人幸福!
.Net Core2.2 使用 AutoMapper进行实体转换的更多相关文章
- Asp.NetCore 3.1 使用AutoMapper自动映射转换实体 DTO,Data2ViewModel
1:什么是AutoMapper? 下面为AutoMapper官方的解释: AutoMapper是一个对象-对象映射器.对象-对象映射通过将一种类型的输入对象转换为另一种类型的输出对象来工作. 使Aut ...
- 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射
一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...
- ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射
本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...
- DataTable转List<Model>通用类【实体转换辅助类】
/// <summary> /// DataTable转List<Model>通用类[实体转换辅助类] /// </summary> public class Mo ...
- HBaseConvetorUtil 实体转换工具
HBaseConvetorUtil 实体转换工具类 public class HBaseConvetorUtil { /** * @Title: convetor * @De ...
- Datatable转实体 实体转换辅助类
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...
- html实体转换
摘要: 在 HTML 中,某些字符是预留的.在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签.如果希望正确地显示预留字符,我们必须在 HTML 源代码中 ...
- C# 获取config文件 实体转换
随着项目的扩展,单独的key,value配置文件已经不能满足需求了 这里需要自定义配置节点,例如 <!--自定义 具体实体类配置问节点信息--> <School Name=" ...
- C# 实体集合和实体转换成相应的string、XDocument、XElement、XDocument
https://msdn.microsoft.com/zh-cn/library/system.xml.linq.xelement(v=vs.110).aspx XElement.Parse 方法 ( ...
随机推荐
- Mysql8以上需要指定时区serverTimezone
JDBC连接Mysql8以下 com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test?useUnicode=true&charac ...
- Vue进阶课堂之《从HTML到Pug》
是啥 Pug听起来或许比较陌生,但是如果说起她的前生,相信各位多少会有耳闻:Jade.每当你不停的敲打<><><><></></> ...
- Linux学习4-部署LAMP项目
前言 LAMP——linux Apache Mysql PHP 今天我们来学习如何在Linux部署Discuz论坛 准备工作 1.一台linux服务器,没有购买服务器的小伙伴也可以使用虚拟机,操 ...
- flask 模型一对多个人理解
在modle中创建两个模型表 class User(db.Model): id = db.Column(db.Integer,primary_key=True,autoincrement=True) ...
- Asp.Net Core 2.0实现HttpResponse中繁切换
随笔背景:因为项目中有个简单的功能是需要实现中文简体到繁体的切换,数据库中存储的源数据都是中文简体的,为了省事就想着通过HttpHeader的方式来控制Api返回对应的繁体数据. 实现方式:通过Asp ...
- axios请求拦截器
import axios from 'axios'; // 创建axios实例 let service = null; if (process.env.NODE_ENV === 'deve ...
- 032.核心组件-kube-proxy
一 kube-proxy原理 1.1 kube-proxy概述 Kubernetes为了支持集群的水平扩展.高可用性,抽象出了Service的概念.Service是对一组Pod的抽象,它会根据访问策略 ...
- Hadoop集群搭建(六)~安装JDK
前面集群的准备工作都做完了,本篇记录安装JDK,版本位1.8 1,在opt目录下创建software和module文件夹:software用来放安装包,module为安装目录 2,把JDK和hadoo ...
- Python可以用中文命名
Python中文命名 命名规则数字.字母.下划线 环境 python 3.7.3 x64 win10 现象 Python在命名的地方都是可以用中文命名 如: 变量 中文下划线无法被识别 打出中文下划线 ...
- [vue ]滚动视图解决ElementUI NavMenu 导航菜单过长显示的问题
记录一下工作 需求 导航菜单过长的时候会溢出,需要一个像 Tabs 标签页一样的滚动视图容器,可以左右滚动内部视图. 解决方法 由于时间问题,所以直接将 Tabs 源码抽取出来使用. 这里要做一些特殊 ...