项目中用到了DTO与Model之间的转换,因为model项目比较多,所以需要使用工具或者代码来实现快速的转换。AutoMapper就是一个很好的基于约定的object-object mapper.映射器。

Map规则:

AutoMapper默认是根据实体的属性名称来一一对应映射,你也可以手动的设置Map规则。

接下来举个栗子:

一、默认属性Map (DTO => Model)

准备实体

 namespace MapDemo
{
using System;
using System.Collections.Generic; public partial class Service
{
public Service()
{
this.ServiceDtl = new HashSet<ServiceDtl>();
} public int Id { get; set; }
public string Name { get; set; }
public Nullable<decimal> Price { get; set; } public virtual ICollection<ServiceDtl> ServiceDtl { get; set; } }
}
 namespace MapDemo
{
using System;
using System.Collections.Generic; public partial class ServiceDtl
{
public int DtlId { get; set; }
public string DtlName { get; set; }
public Nullable<int> Id { get; set; } public virtual Service Service { get; set; }
}
}

准备Model

 namespace MapDemo.Model
{
class ServiceModel
{
public int Id { get; set; }
public string Name { get; set; }
public Nullable<decimal> Price { get; set; } public virtual ICollection<ServiceDtl> ServiceDtl { get; set; } }
}
 namespace MapDemo.Model
{
class ServiceDtlModel
{
public int DtlId { get; set; }
public string DtlName { get; set; }
public Nullable<int> Id { get; set; } public virtual Service Service { get; set; }
}
}

Mapper初始化:

Mapper.Initialize(cfg =>
{
  cfg.CreateMap<Service, ServiceModel>();
});

二、单表Map

var  serviceModel= Mapper.Map<ServiceModel>(service);

三、多表多层指定Map

Mapper.Initialize(cfg =>
{
cfg.CreateMap<Service, ServiceModel>().ForMember(d => d.ServiceDtl, opt => opt.MapFrom(s => s.ServiceDtl));
cfg.CreateMap<ServiceDtl, ServiceDtlModel>();
}); var serviceModel= Mapper.Map<ServiceModel>(service);

这样service中就包含了ServiceDtl的项目,操作DB的时候进行反向Map,只需要操作主表,适用于多层表结构的操作,方便快捷,代码量少。

四、Model与Model之间Map

创建一个类似ServiceModel的模型CYService

 namespace MapDemo.Model
{
class CYService
{ public int Id { get; set; }
public string Name { get; set; }
public Nullable<decimal> Price { get; set; } }
}
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Service, CYService>();
});
var cyService = Mapper.Map<CYService>(newItem);

 

简单总结一下:

AutoMapper对于多表的层级操作十分方便,并且易于扩展。

但是项目中不建议直接使用Mapper.Map(),建议使用局部的mapEngine.Map()避免全局Map的影响。

具体参照官方解释:http://automapper.readthedocs.io/en/latest/index.html

说说AutoMapper那些事的更多相关文章

  1. 【道德经】漫谈实体、对象、DTO及AutoMapper的使用

    写在前面 实体和值对象 实体和对象 故常无欲以观其妙,常有欲以观其徼 初始实体和演化实体 代码中的DTO AutoMapper实体转换 后记 实体(Entity).对象(Object).DTO(Dat ...

  2. 结婚虽易,终老不易:EntityFramework和AutoMapper的婚后生活

    写在前面 我到底是什么? 越界的可怕 做好自己 后记 上一篇<恋爱虽易,相处不易:当EntityFramework爱上AutoMapper>文章的最后提到,虽然AutoMapper为了En ...

  3. C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用

    前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...

  4. AutoMapper Getting started

    AutoMapper 是什么? 为什么要用AutoMapper? 如何使用AutoMapper? 在什么地方配置AutoMapper? 如何测试my mappings? AutoMapper 是什么? ...

  5. DTO学习系列之AutoMapper(六)----EntityFramework和AutoMapper的婚后生活

    写在前面 我到底是什么? 越界的可怕 做好自己 后记 文章标题主要关键字:mapping DTOs to Entities,注意并不是“Entities to DTOs”,表示实体对象到DTO的转换, ...

  6. DTO学习系列之AutoMapper(一)

    一.前言 DTO(Data Transfer Object)数据传输对象,注意关键字“数据”两个字,并不是对象传输对象(Object Transfer Object),所以只是传输数据,并不包含领域业 ...

  7. .NET的DTO映射工具AutoMapper

    .NET的DTO映射工具AutoMapper 原文:https://github.com/AutoMapper/AutoMapper/wiki/Getting-started 参考:http://ww ...

  8. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)

    前言 Hi,大家好,我是Rector 时间飞逝,一个星期又过去了,今天还是星期五,Rector在图享网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5程序[Repository+Autof ...

  9. 使用.Net Core Mvc +SqlSugar +Autofac+AutoMapper+....

    开源地址:https://github.com/AjuPrince/Aju.Carefree 目前用到了 SqlSugar.Dapper.Autofac.AutoMapper.Swagger.Redi ...

随机推荐

  1. 禁止迅雷极速版被强制升级为迅雷x

    PS:迅雷极速版( ThunderSpeed1.0.34.360 )下载地址: https://pan.baidu.com/s/1wuBOpNbim5jBru03AfSAVg 按照下面的这个路径去找. ...

  2. Coldfusion Sql查询分组输出

    <cfoutput query="myQry" group="date"> #date# <cfoutput> #detail# < ...

  3. Linux (x86) Exploit 开发系列教程之三(Off-By-One 漏洞 (基于栈))

    off by one(栈)? 将源字符串复制到目标缓冲区可能会导致off by one 1.源字符串长度等于目标缓冲区长度. 当源字符串长度等于目标缓冲区长度时,单个NULL字节将被复制到目标缓冲区上 ...

  4. AE二次开发,解决子窗体使用父窗体的AxControl控件

    在子窗体写构造函数,然后再在父窗体按钮点击事件下写 public frmIDW(AxMapControl axMapControl1) { InitializeComponent(); this.ax ...

  5. Python学习日记(二十四) 继承

    继承 什么是继承?就是一个派生类(derived class)继承基类(base class)的字段和方法.一个类可以被多个类继承;在python中,一个类可以继承多个类. 父类可以称为基类和超类,而 ...

  6. javascript_18-Array 数组

    数组 数组-引用类型,JavaScript中的内置对象 Array对象的属性 length 获取数组的长度(元素个数) 检测数组 instanceof Array.isArray() //h5新增 常 ...

  7. 碰到的TypeError--记录

    TypeError: object of type 'Response' has no len()   我在写爬虫的时候,通过requests获取到了网址的html文件,一开始是用content保存下 ...

  8. 交互式计算引擎REOLAP篇

    交互式计算引擎ROLAP篇   摘自:<大数据技术体系详解:原理.架构与实践> 一.Impala Impala最初由Cloudera公司开发的,其最初设计动机是充分结合传统数据库与大数据系 ...

  9. 大数据技术之Hadoop3.1.2版本伪分布式部署

    大数据技术之Hadoop3.1.2版本伪分布式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.主机环境准备 1>.操作系统环境 [root@node101.yinzh ...

  10. PAT-2019年冬季考试-乙级(题解)

    很荣幸这次能够参加乙级考试,和大佬们同台竞技了一次,这篇博客,进行介绍这次2019冬季的乙级考试题解. 7-1 2019数列 (15分) 把 2019 各个数位上的数字 2.0.1.9 作为一个数列的 ...