我想很多后端开发者,纠结于如何在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做对象关系映射的更多相关文章

  1. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

  2. 死去活来,而不变质:Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

    写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:DDD(领域驱动设计)应对具体业务场景,如何聚焦 Domain Model(领域模型)?>博文中, ...

  3. Hibernate(开放源代码的对象关系映射框架)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自 ...

  4. ORM即 对象-关系映射(转自:微冷的雨)

    ORM即 对象-关系映射: 将数据库中的数据关系表,映射为实体对象. 灵动思绪EF(Entity FrameWork) 作者: 微冷的雨  来源: 博客园  发布时间: 2013-01-22 16:2 ...

  5. LLBL Gen Pro 4.2 Lite 免费的对象关系映射开发框架与工具

    LLBL Gen Pro是一款优秀的对象关系映射开发框架,自2003年发布以来,一直有广泛的客户群.LLBL Gen Pro有几个标志性的版本,2.5/2.6是一个很稳定的版本,公司的一些旧的项目仍然 ...

  6. android对象关系映射框架ormlite之一对多(OneToMany)

    前两天,用ormlite对单张表进行了基本的操作,但是,我们知道通常情况对于单张表格进行操作在实际情况中很前两天不现实,那么ormlite能否像Hibenate那样实现多张表之间的一对多,多对多(即O ...

  7. Django 源码小剖: Django 对象关系映射(ORM)

    引 从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道. django O ...

  8. Php ORM 对象关系映射

    ORM的全称是Object Relational Mapping,即对象关系映射.它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将 ...

  9. Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射?

    Domain Model(领域模型) 和 EntityFramework 如何正确进行对象关系映射? 写在前面 阅读目录: 设计误区 数据库已死 枚举映射 关联映射 后记 在上一篇<一缕阳光:D ...

随机推荐

  1. 51 Nod 1035 最长的循环节 (此题还不是很懂,日后再看)

    转自: https://blog.csdn.net/define_danmu_primer/article/details/52456763 51nod 1035 最长的循环节(无限小数的循环节) 2 ...

  2. Java中indexOf的用法

    indexOf有四种用法: 1.indexOf(int ch) 在给定字符串中查找字符(ASCII),找到返回字符数组所对应的下标找不到返回-1 2.indexOf(String str)在给定符串中 ...

  3. kubernetes集群搭建

    工作环境: 主机名 IP 系统 master 192.168.199.6 rhel7.4 node1 192.168.199.7 rhel7.4 node2 192.168.199.8 rhel7.4 ...

  4. $\LaTeX$数学公式大全8

    $8\ Miscellaneous\ symbols$ $\infty$ \infty $\nabla$ \nabla $\partial$ \partial $\eth$ \eth $\clubsu ...

  5. Xargs用法详解(自创)

    简介之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: 这个命令是错误的find /sbin -perm +700 |ls -l ...

  6. 一步一步实现一个Promise A+规范的 Promise

    2015年6月,ES2015(即ES6)正式发布后受到了非常多的关注.其中很重要的一点是 Promise 被列为了正式规范. 在此之前很多库都对异步编程/回调地狱实现了类 Promise 的应对方案, ...

  7. (十八)C语言之预编译命令、宏

  8. 【软件工程】团队Git现场编程实战

    组长博客链接 博客链接 组员职责分工 队员 职责分工 恩泽 进行任务的划分与安排,调用API,负责餐饮商铺及商圈信息的获取 金海 解析API返回的json数据,提取有关信息 君曦 部分算法编写 季城 ...

  9. linux开启数据库远程连接

    1.阿里云开启数据库端口 3306 2. 修改 Mysql-Server 用户配置 mysql -uroot -p(注意此用户必须要有最高级权限才行 默认root用户) mysql> USE m ...

  10. oracle 查看数据库和表命令

    1.su – oracle 不是必需,适合于没有DBA密码时使用,可以不用密码来进入sqlplus界面. 2.sqlplus /nolog 或sqlplus system/manager 或./sql ...