.Net Core使用AutoMapper做对象关系映射
我想很多后端开发者,纠结于如何在Dto及表实体中做属性关系映射,因为真的太繁琐了。,
⒈如何使用?
Mapper.Initialize(cfg => cfg.CreateMap<UsersInputDto, Users>());
UsersInputDto input = new UsersInputDto()
{
id = , firstname = "fan", lastname = "qi", uname = "fanqisoft", pwd = "admin", enabled =
};
Users user = Mapper.Map<Users>(input);
⒉映射前或映射后进行操作
首先附上实体类
using System;
using System.Collections.Generic;
using System.Text; namespace AutoMapperTest.Entities
{
public class Users
{
public int id { get; set; }
public string fullname { get; set; }
public int? age { get; set; }
public string username { get; set; } public string password { get; set; }
public int? enabled { get; set; } public override string ToString()
{
return $"用户ID:{this.id} \n用户姓名:{this.fullname}\n用户名:{this.username} \n用户密码:{this.password} \n用户是否启用:{(this.enabled==1?'是':'否')}";
}
}
}
InputDto
using System;
using System.Collections.Generic;
using System.Text; namespace AutoMapperTest.Entities
{
public class UsersInputDto
{
public int id { get; set; }
public string firstname { get; set; }
public string lastname { get; set; }
public int? age { get; set; }
public string uname { get; set; } public string pwd { get; set; }
public int? enabled { get; set; }
}
}
当前端InputDto传到后端时,我需要将Dto中的firstname及lastname合并转换为数据表中的fullname
Mapper.Initialize(cfg =>
{
cfg.CreateMap<UsersInputDto, Users>().BeforeMap((dto, ent) => ent.fullname = dto.firstname + "_" + dto.lastname);
});
⒊条件映射,必须必要的条件后才会映射属性。
Mapper.Initialize(cfg =>
{
cfg.CreateMap<UsersInputDto, Users>().ForMember(d => d.age, u => u.Condition(s => s.age >= && s.age <= ));
});
⒋属性对应映射,Dto中属性名 != 数据表属性名
Mapper.Initialize(cfg =>
{
cfg.CreateMap<UsersInputDto, Users>().ForMember(d => d.username, u => u.MapFrom(s => s.uname))
.ForMember(d => d.password, u => u.MapFrom(s => s.pwd));
});
⒌使用配置文件?实现Profile类并在构造器中初始化你的配置。
using AutoMapper;
using AutoMapperTest.Entities;
using System;
using System.Collections.Generic;
using System.Text; namespace AutoMapperTest.AutoMapper
{
public class AutoMapperConfig:Profile
{
public AutoMapperConfig()
{
CreateMap<UsersInputDto, Users>();
}
}
}
Mapper.Initialize(cfg =>
{
cfg.CreateMap<UsersInputDto, Users>().ForMember(d => d.username, u => u.MapFrom(s => s.uname))
.ForMember(d => d.password, u => u.MapFrom(s => s.pwd));
cfg.AddProfile<AutoMapperConfig>(); //添加一个配置文件
});
⒍Dto中数据类型和数据表不一致那就自定义转换器吧。
using AutoMapper;
using AutoMapperTest.Entities;
using System;
using System.Collections.Generic;
using System.Text; namespace AutoMapperTest.AutoMapper
{
public class UsersConverter:ITypeConverter<Users,UsersOutputDto>
{
public UsersOutputDto Convert(Users source, UsersOutputDto destination, ResolutionContext context)
{
string[] names = source.fullname.Split("_");
return new UsersOutputDto()
{
id = source.id,
firstname = names[],
lastname = names[]
};
}
}
}
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Users, UsersOutputDto>().ConvertUsing<UsersConverter>();
});
Users users = new Users()
{
id = , fullname = "fan_qi",age = ,username = "fanqisoft",password ="admin",enabled =
};
UsersOutputDto output = Mapper.Map<UsersOutputDto>(users);
⒎附一个可用的静态工具类
using AutoMapper;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Text; namespace AutoMapperTest.AutoMapper
{
/// <summary>
/// AutoMapper扩展帮助类
/// </summary>
public static class AutoMapperHelper
{
/// <summary>
/// 类型映射
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
public static T MapTo<T>(this object obj)
{
if(obj == null)
{
return default(T);
}
Mapper.Initialize(cfg =>
{
cfg.CreateMap(obj.GetType(), typeof(T));
});
return Mapper.Map<T>(obj);
} /// <summary>
/// 集合列表类型映射
/// </summary>
public static List<TDestination> MapToList<TDestination>(this IEnumerable source)
{
foreach (var first in source)
{
var type = first.GetType();
Mapper.Initialize(cfg =>
{
cfg.CreateMap(type, typeof(TDestination));
});
break;
}
return Mapper.Map<List<TDestination>>(source);
}
/// <summary>
/// 集合列表类型映射
/// </summary>
public static List<TDestination> MapToList<TSource, TDestination>(this IEnumerable<TSource> source)
{
//IEnumerable<T> 类型需要创建元素的映射
Mapper.Initialize(cfg =>
{
cfg.CreateMap<TSource, TDestination>();
});
return Mapper.Map<List<TDestination>>(source);
}
/// <summary>
/// 类型映射
/// </summary>
public static TDestination MapTo<TSource, TDestination>(this TSource source, TDestination destination)
where TSource : class
where TDestination : class
{
if (source == null) return destination;
Mapper.Initialize(cfg =>
{
cfg.CreateMap<TSource, TDestination>();
});
return Mapper.Map(source, destination);
}
/// <summary>
/// DataReader映射
/// </summary>
public static IEnumerable<T> DataReaderMapTo<T>(this IDataReader reader)
{
Mapper.Reset();
Mapper.Initialize(cfg =>
{
cfg.CreateMap<IDataReader, IEnumerable<T>>();
});
return Mapper.Map<IDataReader, IEnumerable<T>>(reader);
}
}
}
.Net Core使用AutoMapper做对象关系映射的更多相关文章
- Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包
Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...
- 死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?
写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>博文中, ...
- Hibernate(开放源代码的对象关系映射框架)
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...
- ORM即 对象-关系映射(转自:微冷的雨)
ORM即 对象-关系映射: 将数据库中的数据关系表,映射为实体对象. 灵动思绪EF(Entity FrameWork) 作者: 微冷的雨 来源: 博客园 发布时间: 2013-01-22 16:2 ...
- LLBL Gen Pro 4.2 Lite 免费的对象关系映射开发框架与工具
LLBL Gen Pro是一款优秀的对象关系映射开发框架,自2003年发布以来,一直有广泛的客户群.LLBL Gen Pro有几个标志性的版本,2.5/2.6是一个很稳定的版本,公司的一些旧的项目仍然 ...
- android对象关系映射框架ormlite之一对多(OneToMany)
前两天,用ormlite对单张表进行了基本的操作,但是,我们知道通常情况对于单张表格进行操作在实际情况中很前两天不现实,那么ormlite能否像Hibenate那样实现多张表之间的一对多,多对多(即O ...
- Django 源码小剖: Django 对象关系映射(ORM)
引 从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道. django O ...
- Php ORM 对象关系映射
ORM的全称是Object Relational Mapping,即对象关系映射.它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将 ...
- Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?
Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射? 写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:D ...
随机推荐
- 二叉树的序遍历x(内含结构体与非结构体版x)
3143 codevs 二叉树的序遍历 题目描述 Description 求一棵二叉树的前序遍历,中序遍历和后序遍历 输入描述 Input Description 第一行一个整数n,表示这棵树的节点个 ...
- python拼音库pypinyin库详解
# -*- coding: utf-8 -*- # @Author : FELIX # @Date : 2018/6/30 9:20 from pypinyin import pinyin, lazy ...
- Vue_(组件通讯)单项数据流
Vue单项数据流 传送门 单向数据流:父组件值的更新,会影响到子组件,反之则不行 修改子组件的值: 局部数据:在子组件中定义新的数据,将父组件传过来的值赋值给新定义的数据,之后操作这个新数据 如果对数 ...
- JS基础_原型对象
原型prototype 我们创建的每一个函数,解析器都会向函数中添加一个属性prototype 这个属性,对应着一个对象,这个对象就是我们所谓的原型对象 1.如果函数作为普通函数调用prototype ...
- 统计网络time_wait连接状态及tcpip连接数
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' LAST_ACK 1 SYN_RECV 14 ESTABLIS ...
- koa 基础(九) ejs 模板引擎的使用
1.app.js /** * ejs 模板引擎的使用: * 1.npm install koa-views --save * 2.npm install ejs --save * 3.var view ...
- WorkStation 虚拟机迁移到 ESXi
将Workstation的vmdk文件导入到Esxi. 提示如题错误提示. 无法打开磁盘 scsi0:0: 磁盘类型 7 不受支持或无效.请确保磁盘已导入. 在VMware Workstation,V ...
- Android res之shape
xml控件配置属性 android:background="@drawable/shape" 标签 corners ----------圆角gradient ----------渐 ...
- 如何实现一个串行promise
异步执行任务A.B.C,...... 1.使用数组的reduce方法,reduce里有四个参数,pre,next,index,arr, 2.如果then方法里返回的是一个promise对象,那么执行下 ...
- LC 966. Vowel Spellchecker
Given a wordlist, we want to implement a spellchecker that converts a query word into a correct word ...