我想很多后端开发者,纠结于如何在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. TTTTTTTTTTTTTT hdu 5763 Another Meaning 哈希+dp

    Another Meaning Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  2. P1121 环状最大两段子段和(DP)

    P1121 环状最大两段子段和 难度 提高+/省选- 题目描述 给出一段环状序列,即认为A[1]和A[N]是相邻的,选出其中连续不重叠且非空的两段使得这两段和最大. 输入输出格式 输入格式: 输入文件 ...

  3. C语言中的位域[转]

    有些信息在存储时,并不需要占用一个完整的字节,而只需要一个或几个二进制位即可;比如:在存放一个开关量时,只有0和1两种状态,只需要使用一个二进制位即可存储;为了节省存储空间,C语言提供了一种数据结构, ...

  4. clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

  5. 0.JQuery学习

    jQuery 教程 jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程. jQuery 简介 jQuery 库可以通过一行简单的标记被添加到网页中 ...

  6. vue中getters不更新数据解决办法

    在 Vue.js devtools 中看到,我们明明更改了仓库 state 中的数据,但是我们的 getters 就是值渲染一次之后就不再重新渲染了 解决方法:使用 Vue.set() 方法,就是专门 ...

  7. Linux上安装Python3

    1. 安装支持包 yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-devel ope ...

  8. Creator性能优化

    性能优化主要这几个方面进行优化:加载优化,渲染优化,内存优化,CPU优化及一些小技巧. 加载优化 图片资源处理:巧用九宫格拉伸来实现资源得复用,如大的纯色背景图,完全可以使用一张小图来进行拉伸获得: ...

  9. JSP学习案例--,竞猜游戏

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  10. 数据库高级数据库学习--上机练习7(Transact-SQL 函数定义和调用)

    上机练习7 在Transact SQL中,有一类特殊的自定义函数,其返回值为一张表,该类自定义函数被称作内嵌(联)表值函数,其基本语句格式如下: CREATE FUNCTION函数名称[( {@参数名 ...