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实体支 ...
随机推荐
- WebGPU学习(三):MSAA
大家好,本文学习MSAA以及在WebGPU中的实现. 上一篇博文 WebGPU学习(二): 学习"绘制一个三角形"示例 下一篇博文 WebGPU学习(四):Alpha To Cov ...
- css3学习——一列固定宽度且居中
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- 即将到来的“分布式云”(DPaaS):分布式计算+ DB +存储即服务
我在区块链会议上就即将到来的公共"分布式云"系统进行了讨论,该系统将主流的公共云平台(如AWS,Azure,Google Cloud,Heroku等)与区块链和P2P网络相结合,比 ...
- Kubernetes v1.17 版本解读 | 云原生生态周报 Vol. 31
作者 | 徐迪.李传云.黄珂.汪萌海.张晓宇.何淋波 .陈有坤.李鹏审核 | 陈俊 上游重要进展 1. Kubernetes v1.17 版本发布 功能稳定性是第一要务.v1.17 包含 22 个增强 ...
- Xcode10.0: NO BUNDLE URL PRESENT
目录 解决方案 1.删除build, 重新运行, 没有work 2.删除node_modules, npm i, 重新运行, 没有work 3.删除端口占用 4.代理设置, 可能work了 解决方案 ...
- go break的使用
文章目录 一.踩得坑 二.break的使用 1.break用于for循环 2. break用于select 3.break用于嵌套循环 4.break label . goto label .cont ...
- 笔记||Python3之文件的读写
[文件的读模式] 文件的对象:文件的读写通过文件操作对象进行. Python2 ----- File Python3 ----- TextIOWrapper ...
- 【重温基础】17.WebAPI介绍
本文是 重温基础 系列文章的第十七篇. 今日感受:挑战. 系列目录: [复习资料]ES6/ES7/ES8/ES9资料整理(个人整理) [重温基础]1-14篇 [重温基础]15.JS对象介绍 [重温基础 ...
- GitHub上传自己的项目
git下载地址:https://git-scm.com/downloads 1.下载git,直接下一步进行安装 2.安装完成后,双击git-bash.exe运行 3.cd进入你的项目路径 4.输入 g ...
- 【Ubuntu 16.04.2_64】安装配置SVN
[Ubuntu 16.04.2_64]安装配置SVN 转载:https://www.cnblogs.com/yangchongxing/p/10190549.html 检查是否已安装svn # svn ...