netcore 2.2 使用 AutoMapper 实现实体之间映射
一、什么是AutoMapper?
AutoMapper是一个简单的对象映射框架(OOM),将一个对象映射到另一个对象。
二、AutoMapper的好处
以前的时候我们将DTO对象转换为Model对象时,我们必须将每一个属性都手动映射
实体类
/// <summary>
/// 用户表
/// </summary>
[Table("tb_User")]
public class TbUser
{
/// <summary>
/// 用户Id
/// </summary>
[Key]
[Column("userId")]
[StringLength()]
public string UserId { get; set; }
/// <summary>
/// 用户名
/// </summary>
[Column("userName")]
[StringLength()]
public string UserName { get; set; }
/// <summary>
/// 邮箱
/// </summary>
[Column("email")]
[StringLength()]
public string Email { get; set; }
/// <summary>
/// 添加时间
/// </summary>
[Column("addTime")]
[Required]
public DateTime AddTime { set; get; }
}
DTO传输对象
/// <summary>
/// 用户传输对象
/// </summary>
public class UserDto
{
/// <summary>
/// 用户Id
/// </summary>
[StringLength(, ErrorMessage = "{0}最多{1}个字符"), Display(Name = "用户Id")]
public string UserId { get; set; }
/// <summary>
/// 用户名
/// </summary>
[StringLength(, ErrorMessage = "{0}最多{1}个字符"), Display(Name = "用户名")]
public string UserName { get; set; }
/// <summary>
/// 邮箱
/// </summary>
[StringLength(, ErrorMessage = "{0}最多{1}个字符"), Display(Name = "邮箱")]
public string Email { get; set; }
}
业务层
/// <summary>
/// 业务处理
/// </summary>
public class UserService : IUserService
{
private readonly MyDbContext _dbContext; /// <summary>
/// 构造函数
/// </summary>
/// <param name="dbContext"></param>
public UserService(MyDbContext dbContext)
{
_dbContext = dbContext;
}
/// <summary>
/// 添加用户
/// </summary>
/// <param name="dto">实体传输对象</param>
/// <returns></returns>
public int Add(UserDto dto)
{
var user = new TbUser
{
UserId = Guid.NewGuid().ToString("N"),
Email = dto.Email,
UserName = dto.UserName,
AddTime = DateTime.Now
};
_dbContext.Add(user);
return _dbContext.SaveChanges();
}
/// <summary>
/// 编辑用户信息
/// </summary>
/// <param name="dto">实体传输对象</param>
/// <returns></returns>
public int Update(UserDto dto)
{
var user = _dbContext.TbUsers.Find(dto.UserId);
if(user==null) throw new Exception("获取用户信息失败");
user.UserName = dto.UserName;
user.Email = dto.Email;
return _dbContext.SaveChanges();
}
}
这样情况还可以,属性不是很多,如果属性过多(几十,几百),还需要手动赋值,简直太头疼了,还会导致大量的时间浪费在对象转换中,用AutoMapper,只需要简单的配置就可以完成两个对象之间的属性映射,开发中省去了属性转换的时间,从而提高工作效率。
三、使用AutoMapper
安装引用
通过程序包管理器控制台安装AutoMapper
Install-Package AutoMapper -version 9.0.0
Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection -version 7.0.0
配置映射关系
创建一个类并继承autoMapper的Profile类
public class Mappings : Profile
{
public Mappings()
{
CreateMap<UserDto, TbUser>();
}
}
注入服务
//注入AutoMapper服务,Mappings就是自己创建的映射类
services.AddAutoMapper(typeof(Mappings));
修改业务层代码
/// <summary>
/// 业务处理
/// </summary>
public class UserService : IUserService
{
private readonly MyDbContext _dbContext;
/// <summary>
/// 注入接口
/// </summary>
private readonly IMapper _mapper; /// <summary>
/// 构造函数
/// </summary>
/// <param name="dbContext"></param>
/// <param name="mapper"></param>
public UserService(MyDbContext dbContext,IMapper mapper)
{
_dbContext = dbContext;
_mapper = mapper;
}
/// <summary>
/// 添加用户
/// </summary>
/// <param name="dto">实体传输对象</param>
/// <returns></returns>
public int Add(UserDto dto)
{
var info = _mapper.Map<UserDto, TbUser>(dto);
info.AddTime=DateTime.Now;
info.UserId = Guid.NewGuid().ToString("N");
//var user = new TbUser
//{
// UserId = Guid.NewGuid().ToString("N"),
// Email = dto.Email,
// UserName = dto.UserName,
// AddTime = DateTime.Now
//};
_dbContext.Add(info);
return _dbContext.SaveChanges();
}
/// <summary>
/// 编辑用户信息
/// </summary>
/// <param name="dto">实体传输对象</param>
/// <returns></returns>
public int Update(UserDto dto)
{
var user = _dbContext.TbUsers.Find(dto.UserId);
if(user==null) throw new Exception("获取用户信息失败");
//user.UserName = dto.UserName;
//user.Email = dto.Email;
_mapper.Map(dto, user);
return _dbContext.SaveChanges();
}
}
运行测试
PS:一般在使用AutoMapper转换时dto中字段名称要跟实体对象定义一样才能转换成功。
netcore 2.2 使用 AutoMapper 实现实体之间映射的更多相关文章
- Asp.NetCore 3.1 使用AutoMapper自动映射转换实体 DTO,Data2ViewModel
1:什么是AutoMapper? 下面为AutoMapper官方的解释: AutoMapper是一个对象-对象映射器.对象-对象映射通过将一种类型的输入对象转换为另一种类型的输出对象来工作. 使Aut ...
- NetCore+AutoMapper多个对象映射到一个Dto对象
目录 一. 定义源映射类和被映射类DTO二.注入AutoMapper三.配置映射四.写测试 一.定义源映射对象 为了体现AutoMapper映射特性,在SocialAttribute中的Name属性没 ...
- ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射
本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...
- .Net Core2.2 使用 AutoMapper进行实体转换
一.遇到的问题 在. Core Api 的编写中,我们经常会对一些功能点进行新增编辑操作,同时我们有时也会进行查询,但是我们查询的表的数据与我们返回的数据相差甚大,这是我们有需要自己手动进行类型的转换 ...
- 实体之间的关系【Entity Relationships】(EF基础系列篇9)
Here, you will learn how entity framework manages the relationships between entities. Entity framewo ...
- RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大、最高效的方法之一。它为在分布式计算环境中运行的几乎所有应用程序提供基础。
RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大.最高效的方法之一.它为在分布式计算环境中运行的几乎所有应用程序提供基础.本文介绍 RPC 客户机和服务器之间基本的事件流 ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射
上一篇文章(https://www.cnblogs.com/meowv/p/12961014.html)集成了定时任务处理框架Hangfire,完成了一个简单的定时任务处理解决方案. 本篇紧接着来玩一 ...
- AutoMapper指定列名进行映射
有了AutoMapper,就再也不用进行手工一对一的从IDataReader到实体字段的赋值.这篇博文是一个实际案例的记录. 实体类型定义如下: public class UploadImage { ...
- JPA实体继承映射
注意:据说,在本文所指的实体是@Entity注解的类. JPA在对象 - 关系映射通常情况下一个实体对应表,不管是什么这两个实体之间的关系.假设两个实体之间的继承关系.那么它是如何映射? JPA实体支 ...
随机推荐
- 2019-2020-7 20199317《Linux内核原理与分析》第七周作业
第6章 进程的描述和进程的创建 1 进程的描述 操作系统内核实现操作系统的三大管理功能,即进程管理.内存管理和文件系统.其中,操作系统内核中最核心的功能是进程管理.为了管理进程,内核要 ...
- pikachu 暴力破解
一 暴力破解 1.基于表单的暴力破解 先随意测试root/root登录,用Burp抓包,丢进Intruder 添加username和password两个参数变量,攻击类型选择Clusterbomb 有 ...
- Java修炼——String类_常用方法_常量池
String类的定义:String 是不可变字符序列 String 类的常用方法(全部都是不能改变String本身的值,都是在常量池里输出,没有改变其值) String string="ab ...
- 编译安装nginx时配置开机自启
详细编译安装nginx请参考[Nginx目录结构与配置文件详解]以及[Nginx安装部署],在这里就进行简单安装 安装Nginx 环境介绍 操作系统: [root@localhost ~]# cat ...
- 001_Java概述与环境搭建
Java由来: SUN公司开发,95年推出,96年推出JDK1.0版本 09年被Oracle(甲骨文)收购 詹姆斯·高斯林被称作“Java之父” JavaSE:Java Standard Editoi ...
- IPV6技术笔记(剖析IPv4toIPv6)
IPV6技术笔记 IPv6地址入门概念 什么是IPv6? IPv6,全称Internet Protocol version 6,即网际协议版本6,也叫互联网通信协议第六版.是互联网工程任务组(IETF ...
- 【hibernate】映射可嵌入式组件
[hibernate]映射可嵌入式组件 转载:https://www.cnblogs.com/yangchongxing/p/10376452.html 可嵌入 Address 类,没有对应的数据表 ...
- 重学前端--js是面向对象还是基于对象?
重学前端-面向对象 跟着winter老师一起,重新认识前端的知识框架 js面向对象或基于对象编程 以前感觉这两个在本质上没有什么区别,面向对象和基于对象都是对一个抽象的对象拥有一系列的行为和状态,本质 ...
- [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
- webpack安装出错(电脑设置了代理)
安装webpack的时候发现第一句话就报错了,之后查了一下找到原因,原来是因为设置了代理服务原文 ,参考了之后知道是因为代理问题,就按着来做