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实体支 ...
随机推荐
- JWT攻击手册:如何入侵你的Token
JSON Web Token(JWT)对于渗透测试人员而言,可能是一个非常吸引人的攻击途径.因为它不仅可以让你伪造任意用户获得无限的访问权限,而且还可能进一步发现更多的安全漏洞,如信息泄露,越权访问, ...
- 如何在ASP.NET Core 中快速构建PDF文档
比如我们需要ASP.NET Core 中需要通过PDF来进行某些简单的报表开发,随着这并不难,但还是会手忙脚乱的去搜索一些资料,那么恭喜您,这篇帖子会帮助到您,我们就不会再去浪费一些宝贵的时间. 在本 ...
- mac版 sublime快捷键大全
按这几大类分类:文件 编辑 选择 查找 视图 去往 工具 项目 窗口 帮组一.文件cmd + N 新建文件cmd + S 保存文件cmd + shift + S 文件另存为cmd + alt + S ...
- CodeForces 5C Longest Regular Backet sequence
This is yet another problem dealing with regular bracket sequences. We should remind you that a brac ...
- Linux基础 - Crontab定时任务
目录 设置Cron任务 创建任务 设置运行周期 配置命令 常见问题 如何列出所有的Cron任务 如何查看Cron任务运行log 如何配置带有虚拟venv的Python脚本 如何在Cron 任务中发送邮 ...
- 【CSS】352- 有趣的CSS弹跳动画
点击上方"前端自习课"关注,学习起来~ 这是只用了一个div来做的小动画,纯粹利用CSS3的animation来完成,就像是一个正方形在地上弹跳,碰到地面的时候尖角还会压缩变圆,阴 ...
- 【consul】使用学习
[consul]使用学习 转载:https://www.cnblogs.com/yangchongxing/p/10653791.html 1.下载 consul https://www.consul ...
- 【设计模式】代理模式-Proxy
转载:https://www.cnblogs.com/yangchongxing/p/7654725.html 代理模式定义如下: Provide a surrogate or placeholder ...
- Django之models模块
一.字段 1. AutoField(Field) int自增列,必须填入参数 primary_key=True 2.BigAutoField(AutoField) bigint自增列,必须填入参数 p ...
- ansible部署Tomcat
首先要准备的环境就是免密登录 这是要在ansible-playbook中所写的内容---- hosts: tomcat tasks: - name: 关闭防火墙 service: name ...