https://www.jianshu.com/p/d72400b337e0

AutoMapper现在支持更丰富的反向映射支持。 假设有以下实体:

public class Order {
public decimal Total { get; set; }
public Customer Customer { get; set; }
} public class Customer {
public string Name { get; set; }
}

我们可以将它扁平化为以下DTO:

public class OrderDto {
public decimal Total { get; set; }
public string CustomerName { get; set; }
}

我们可以双向映射,包括逆向扁平化:

Mapper.Initialize(cfg => {
cfg.CreateMap<Order, OrderDto>()
.ReverseMap();
});

AutoMapper通过调用ReverseMap创建了反向映射配置,其中包括逆向扁平化:

var customer = new Customer {
Name = "Bob"
}; var order = new Order {
Customer = customer,
Total = 15.8m
}; var orderDto = Mapper.Map<Order, OrderDto>(order); orderDto.CustomerName = "Joe"; Mapper.Map(orderDto, order); order.Customer.Name.ShouldEqual("Joe");

逆向扁平化仅针对ReverseMap进行配置。 如果你想要逆向扁平化,你必须配置Entity - > Dto然后调用ReverseMapDto - > Entity创建一个逆向扁平化类型的映射配置。

自定义反向映射

AutoMapper将根据原始扁平化规则自动将CustomerName映射为Customer.Name。 如果使用了MapFromAutoMapper将根据实际配置尝试反向映射:

cfg.CreateMap<Order, OrderDto>()
.ForMember(d => d.CustomerName, opt => opt.MapFrom(src => src.Customer.Name))
.ReverseMap();

只要MapFrom路径是成员访问器,AutoMapper就会从同一路径反向映射(CustomerName => Customer.Name)。

如果要自定义反向映射路径,可以使用ForPath

cfg.CreateMap<Order, OrderDto>()
.ForMember(d => d.CustomerName, opt => opt.MapFrom(src => src.Customer.Name))
.ReverseMap()
.ForPath(s => s.Customer.Name, opt => opt.MapFrom(src => src.CustomerName));

上面的列子没有多大意义,因为原始MapFrom会自动反向映射。只有在映射和反向映射路径不同时才使用ForPath进行设置。

如果不想要逆向扁平化行为,可以不调用ReverseMap,然后单独创建两个映射配置。 或者使用Ignore

cfg.CreateMap<Order, OrderDto>()
.ForMember(d => d.CustomerName, opt => opt.MapFrom(src => src.Customer.Name))
.ReverseMap()
.ForPath(s => s.Customer.Name, opt => opt.Ignore());

03.AutoMapper 之反向映射与逆向扁平化(Reverse Mapping and Unflattening)的更多相关文章

  1. Linux mem 2.6 Rmap 内存反向映射机制

    文章目录 1. 简介 2. 匿名内存 Rmap 的建立 2.1 fork() 2.2 do_page_fault() 3. 文件内存 Rmap 的建立 3.1 fork() 3.2 do_page_f ...

  2. 1.AutoMapper核心:扁平化

    对象 - 对象映射的一个常见用法是获取一个复杂的对象模型,并将其展开成一个更简单的模型. 您可以采取复杂的模型,如: public class Order { private readonly ILi ...

  3. ASP.NET CORE 中使用AutoMapper进行对象映射

    ASP.NET CORE 中使用AutoMapper进行对象映射 1.什么是AutoMapper? AutoMapper是基于对象到对象约定的映射工具,常用于(但并不仅限制于)把复杂的对象模型转为DT ...

  4. 02.AutoMapper 之扁平化(Flattening)

    https://www.jianshu.com/p/65099590c930   扁平化(Flattening) 对象映射器的常见用法是将一个复杂对象模型扁平化为一个简单模型.例如您有一个以下复杂模型 ...

  5. Linux 匿名页的反向映射

    我们知道LINUX的内存管理系统中有"反向映射"这一说,目的是为了快速去查找出一个特定的物理页在哪些进程中被映射到了什么地址,这样如果我们想把这一页换出(SWAP),或是迁移(Mi ...

  6. Linux内存管理 (12)反向映射RMAP

    专题:Linux内存管理专题 关键词:RMAP.VMA.AV.AVC. 所谓反向映射是相对于从虚拟地址到物理地址的映射,反向映射是从物理页面到虚拟地址空间VMA的反向映射. RMAP能否实现的基础是通 ...

  7. linux内存源码分析 - 内存回收(匿名页反向映射)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 概述 看完了内存压缩,最近在看内存回收这块的代码,发现内容有些多,需要分几块去详细说明,首先先说说匿名页的反向映 ...

  8. ASP.NET Core Web 应用程序系列(五)- 在ASP.NET Core中使用AutoMapper进行实体映射

    本章主要简单介绍下在ASP.NET Core中如何使用AutoMapper进行实体映射.在正式进入主题之前我们来看下几个概念: 1.数据库持久化对象PO(Persistent Object):顾名思义 ...

  9. 08.AutoMapper 之嵌套映射(Nested Mappings)

    https://www.jianshu.com/p/013715d2352d   嵌套映射(Nested Mappings) 当映射引擎执行映射时,它可以使用各种方法之一来解析目标成员值.其中一种方法 ...

随机推荐

  1. python 输出一个随机数

    题目:输出一个随机数. 程序分析:使用 random 模块. #!/user/bin/env python #coding:utf-8 import random print random.rando ...

  2. xwiki安装部署

    环境介绍 http://aiushtha-mybook.stor.sinaapp.com/xwiki/xwiki%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E8%BF%9 ...

  3. Python 爬虫如何入门学习?

    "入门"是良好的动机,但是可能作用缓慢.如果你手里或者脑子里有一个项目,那么实践起来你会被目标驱动,而不会像学习模块一样慢慢学习. 另外如果说知识体系里的每一个知识点是图里的点,依 ...

  4. 使用GitHub(一):添加SSHkey

    使用GitHub(一):添加SSHkey 本文简单介绍使用GitHub对代码进行版本控制,包括添加SSHkey.配置Git.使用Git创建版本库并在GitHub上进行管理,主要目的是对学习内容进行总结 ...

  5. Window下PHP环境配置使用Redis总结

    什么是Redis? Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.它和Memcached类似,它支持存储的 ...

  6. C# App.config全攻略

    读语句:          String str = ConfigurationManager.AppSettings["DemoKey"]; 写语句: Configuration ...

  7. WPF DevExpress Chart控件 界面绑定数据源,不通过C#代码进行绑定

    <Grid x:Name="myGrid" Loaded="Grid_Loaded" DataContext="{Binding PartOne ...

  8. Monkey测试:启动adb shell失败

    1.在dos环境下输入adb shell 2.遇到adb server version doesn't match this client:killing错误 如: 3.在遇到如上问题时,输入adb ...

  9. Python学习之==>函数

    一.函数是什么: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需要调用函数名就行. 二.函数的作用: 1.简化代码 2.提高代码的复用性 3.代码可扩展 三.定义函数: ...

  10. $destroy——angular

    参考资料:[http://odetocode.com/blogs/scott/archive/2013/07/16/angularjs-listening-for-destroy.aspx]