一、遇到的问题

  在. 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. 1.    一对一的对应字段实体转换

    我们看到上面就是我们需要转换的实体类和Dto了,对于简单这种转换我们,我们需要在Mapper配置文件中创建一个对应转换关系,然后一行代码进行转换。

  1. 2.     一对一不对应字段转换

    上面我们转换对象都是一对一的转换,都有对应的转换关系。那么我们在实体和Dto中有不对应的关系时我们该如何转换呢?

    就如这样,我们将实体类User转换UserAppointModel类,我们该如何转换呢?如果我们通过第一种转换方式的话,我们会发现Time这个字段是空的,这里我们就需要加额外的配置了,保证User的CreateTime字段可以转换成UserAppointModel的Time字段。

    这里我们使用的是ForMember(),它是对单个成员进行自定义配置的一个方法,也就是说如果还有其他的不对应字段我们依然可以在后面进行自定义配置,使其对应转换。

  1. 3.     多表对应一个Dto进行转换

    我们除了遇到一对一简单转换和特殊字段转换外,我们有时还会遇到多对一的实体转换,例如我们有些时候在Api返回的时候需要对主表和副表的数据进行整合返回成一个实体。这种情况我们怎么返回呢?现在我们看下面的这个案例:

    我们需要把User实体和UserInfo实体转换成UserInfoModel进行输出。逻辑还是这个逻辑,我们需要先转换一个实体,然后在前一个实体的基础上进行另外一个实体转换。那么能不能连续Map两次呢?想法是这个想法,可惜在AutoMapper原有基础上不支持这种写法,不过我们可以重写其方法达到这种效果。

    这里我们可以先创建一个非泛型静态类MapperTest,然后我们在里面写下以下方法:

    这就是我们重写方法了,这样也就可以实现我们上面的想法了。在第一次转换的基础上进行第二转换,也就实现了多对一的转换了。

  1. 4.     集合对应转换

    我们如何进行集合对集合的转换呢?集合与集合之间的转换呢与之前的一对一转换类似,只是我们转换的时候传的类型不是实体,而是List<>集合而已。下面看下User集合转换成UserModel集合的案例:

四、写在后面

  在平常的代码中,我们经常会写一些重复的简单代码,如创建,修改输出实体转换。都是new实体一个一个转换去写,偶尔写那么一两个也还行,写的多了就有点浪费时间和精力了。本文介绍的是在.Net Core2.2中使用AutoMapper进行实体映射转换的,下一篇将介绍.Net Core3.0 AutoMapper9.0的使用与.Net Core2.2中的差别。

项目地址


用爱生活,你会使自己幸福!用爱工作,你会使很多人幸福!

.Net Core2.2 使用 AutoMapper进行实体转换的更多相关文章

  1. Asp.NetCore 3.1 使用AutoMapper自动映射转换实体 DTO,Data2ViewModel

    1:什么是AutoMapper? 下面为AutoMapper官方的解释: AutoMapper是一个对象-对象映射器.对象-对象映射通过将一种类型的输入对象转换为另一种类型的输出对象来工作. 使Aut ...

  2. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

    一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...

  3. ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射

    本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...

  4. DataTable转List<Model>通用类【实体转换辅助类】

    /// <summary> /// DataTable转List<Model>通用类[实体转换辅助类] /// </summary> public class Mo ...

  5. HBaseConvetorUtil 实体转换工具

    HBaseConvetorUtil 实体转换工具类 public class HBaseConvetorUtil {        /**    * @Title: convetor    * @De ...

  6. Datatable转实体 实体转换辅助类

    using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...

  7. html实体转换

    摘要: 在 HTML 中,某些字符是预留的.在 HTML 中不能使用小于号(<)和大于号(>),这是因为浏览器会误认为它们是标签.如果希望正确地显示预留字符,我们必须在 HTML 源代码中 ...

  8. C# 获取config文件 实体转换

    随着项目的扩展,单独的key,value配置文件已经不能满足需求了 这里需要自定义配置节点,例如 <!--自定义 具体实体类配置问节点信息--> <School Name=" ...

  9. C# 实体集合和实体转换成相应的string、XDocument、XElement、XDocument

    https://msdn.microsoft.com/zh-cn/library/system.xml.linq.xelement(v=vs.110).aspx XElement.Parse 方法 ( ...

随机推荐

  1. 视频描述(Video Captioning)近年重要论文总结

    视频描述 顾名思义视频描述是计算机对视频生成一段描述,如图所示,这张图片选取了一段视频的两帧,针对它的描述是"A man is doing stunts on his bike", ...

  2. php-fpm启动失败处理

    报错信息: No pool defined. at least one pool section must be specified in config file [11-Mar-2019 23:57 ...

  3. 开发项目是Integer 与int 什么时候用

    什么时候用Integer : 如果该属性所对应的数据库的字段是主键或者是外键时,用Integer:因为Integer的默认值为null,数据库的主键或者外键不能为空,但是可以为null 什么时候用in ...

  4. Java8 新特性2——强大的Stream API

    强大的Stream API Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.简而言之,Stream API 提供 ...

  5. IDEA激活码(可用2100年,亲测有效)

    三步骤: 1.下载rar包 2.将rar中bin包内容替换IDEA安装目录下bin内容,然后编辑idea.exe.vmoptions和idea64.exe.vmoptions文件,编辑内容一样 将最后 ...

  6. PHP5.6.23+Apache2.4.20+Eclipse for PHP 4.5开发环境配置

    一.Apache配置(以httpd-2.4.20-x64-vc14.zip为例)(http://www.apachelounge.com/download/) 1.安装运行库vc11和vc14 2.解 ...

  7. H5开发移动应用APP(店铺系列一)

    首先,这是个真实的案例,我大兄弟在深圳开汽修店铺,但需要系统来管理日常经营活动,这正不是我擅长的吗? 说干就干,直接后端+web端+移动端来一套,于是紧急赶工,起早摸黑,产出约3万行总量代码,此系统与 ...

  8. node代理遇到的坑记

    在进行前端mock地址代理时候,进行了webpack的node反向代理: 实际mock地址是:http://10.118.183.10/mock/hb/startwork/openredpacket ...

  9. EF6.0 下sql语句自动生成的参数类型decimal(18,2)修改

    很多时候我们需要对插入到数据库的数据的精度做一个控制,例如sql server下保留6位小数使用numeric(10,6) .而到c#里对应的数据类型就是decimal ,但是使用EF6.0的crea ...

  10. Python 装饰器(无参,有参、多重))

    Python装饰器介绍 在Python中,装饰器(decorator)是在闭包的基础上发展起来的. 装饰器的实质是一个高阶函数,其参数是要装饰的函数名,其返回值是完成装饰的函数名,其作用是为已经存在的 ...