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实体支 ...
随机推荐
- 请问1^x+2^x+3^x+\cdots +n^x的算式是什么呢?
目录 总结 请问\(1^x+2^x+3^x+\cdots +n^x\)的算式是什么呢? 一.求和式\(\sum\limits_{i=1}^n{i}\)的算式 如何证明求和简式\(\sum_{i=1}^ ...
- Android多线程之(一)——View.post()篇
前言 提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来 ...
- iOS libsqlite3.0.tbd和libsqlite3.tbd的区别
ibsqlite3.0.tbd 只是一个快捷方式,其实也是指向libsqlite3.tbd的,如果libsqlite3.0.tbd指向的就是最新的libsqlite3.tbd,就不用更新了.
- 对于在Dao层,一个DML操作一个事务,升级到Service层,一个用户,一个事务
原先的连接Connection,只能是来一次,新创建一个连接connection.这样如果事务在Dao层已经默认提交,在service层出错时,对于俩张关联会有俩种不同的结果.为了解决这样的问题,我们 ...
- [TimLinux] docker CentOS7安装docker-ce最新版
1. 环境 $ lsb_release -a # 需要安装 redhat-lsb-core 包 LSB Version: :core-4.1-amd64:core-4.1-noarch Distrib ...
- 简述c和c++的基本区别,你真的懂吗?(面试必学)
前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:angry_youth **1.c和c++的头文件不同:** c的头 ...
- springboot中的pom文件是如何管理依赖的
我们来看一下新建完成后的springboot中的pom文件 <?xml version="1.0" encoding="UTF-8"?> <p ...
- Python利用PyExecJS库执行JS函数
在Web渗透流程的暴力登录场景和爬虫抓取场景中,经常会遇到一些登录表单用DES之类的加密方式来加密参数,也就是说,你不搞定这些前端加密,你的编写的脚本是不可能Login成功的.针对这个问题,现在有 ...
- 大数据学习笔记——Spark完全分布式完整部署教程
Spark完全分布式完整部署教程 继Mapreduce之后,作为新一代并且是主流的计算引擎,学好Spark是非常重要的,这一篇博客会专门介绍如何部署一个分布式的Spark计算框架,在之后的博客中,更会 ...
- JS内置对象-Array之indexOf和lastIndexOf
indexOf() var num = [1, 7, 2, 3, 4, 7, 9] var pos = num.indexOf(7) var pos1 = num.indexOf(7, 2) cons ...