Github 地址:https://github.com/iccb1013/Sheng.Mapper

在上一篇幅中,简单介绍了 升讯威 Mapper( Sheng.Mapper)【http://www.cnblogs.com/sheng_chao/p/7026732.html】,上文的介绍比较粗略,在这篇文章中,直接用几个例子来具体的讲一下它的使用场景,和为什么要使用它,以及和 AutoMapper 的互补使用。

AutoMapper 是一款十分强大的对象映射工具,我在项目中大量的使用了 AutoMapper 这一工具,如处理 DTO 与 实体对象间的映射关系,使用类似如下代码:

但是在使用 AutoMapper 的过程中,有一些小细节会比较麻烦,它不能创建相同对象类型间的映射赋值关系,也不能根据场景为相同的对象映射关系创建不同的映射逻辑,所以我们目前的使用集中的 Dto 与 实体对象间的映射。

我们现在的项目使用了 Entity Framework ,在更新数据时,一般的逻辑是前端传过来一个 DTO 对象,转换成实体对象,根据 Id 去 DBContext 中拿到数据库中的实体对象,再用传入的实体对象给数据库中的对象赋值,SaveChanges。

类似如下代码,用传入的 storehouseBase 给 dbStorehouseBase 赋值:

这里如果使用 AutoMapper   就涉及到两个问题:

1.AutoMapper  是不能为相同的对象类型创建映射规则的,如:

2.如果不使用规则,即使可以直接 Map,实体对象中又存在大量的导航属性,是不能直接覆盖过去的,这就比较麻烦了,我们的项目中开发人员只好手工的用传入的实体对象,一个属性一个属性为数据库中拿到的实体对象赋值,如果要更新的属性比较多,就非常麻烦,此外在修改时给实体对象新增加了属性,是否还能保证记得回到这里来给添加新的赋值代码。

所以在这种场景下, 可以使用 ShengMapper 来解决:

ShengMapper 的 SetValuesSkipVirtual 方法,见文知义,它自动映射两个对象,进行赋值操作,并自动的跳过 Virtual  属性,因为 Entity Framework 的导航属性都是 Virtual   的(DB First)。

此外,还有一些更新赋值场景,存在一些特定的业务逻辑,比如说我更新用户时,不更新 Password 字段,不更新最后登录时间字段,更新订单时,不更新创建时间字段等等,这种同一种对象类型的映射赋值,不但要跳过导航属性,还要跳过指定的字段,也可以使用 ShengMapper  很好的解决,使用类似如下代码:

它的方法原型是:

SetValuesWithoutProperties 方法 把 product 中的属性,更新到 dbProduct 中,同时跳过 Supplier 属性和所有的 Virtual 属性。

那么既然能跳过指定的属性,自然我们也能只更新指定的属性,如:

SetValuesWithProperties 方法把 productEntryBatch 中的属性值更新到 dbProductEntryBatch 中,但是只更新 Name 这个属性。

ShengMapper 还提供了一些其它方法重载:

使用 ShengMapper 是不需要事先创建规则的,所有对对象的映射赋值操作,都是以更灵活的方式来完成的,比如我这一次 User 对 User 要排除 Password ,另一个场景不需要排除,也是可以的,而 AutoMapper 的规则必须是全局唯一的,一旦创建了 UserDTO 对 User 的规则,在所有的时候,都会遵循事先定义的规则去执行。

所以在实际应用中,可以通过与 AutoMapper 互补的方式,解决这方面的问题。

欢迎交流探讨:QQ:279060597  @南京

转载于:https://www.cnblogs.com/sheng_chao/p/7324694.html

Github 开源:使用升讯威 Mapper( Sheng.Mapper)与 AutoMapper 互补,大幅提高开发效率!...相关推荐

  1. GitHub开源:升讯威微信营销系统(第三方微信平台)完整源代码

    GitHub :https://github.com/iccb1013/Sheng.WeixinConstruction 升讯威微信营销系统开发实践系列 升讯威微信营销系统开发实践:(1)功能设计与架 ...

  2. Github 开源:升讯威 Winform 开源控件库( Sheng.Winform.Controls)

    Github 地址:https://github.com/iccb1013/Sheng.Winform.Controls 本控件库中的代码大约写于10年前(2007年左右),难免有不成熟与欠考虑之处, ...

  3. GitHub开源:升讯威 SQLite 增强组件 Sheng.SQLite.Plus

    Github:https://github.com/iccb1013/Sheng.SQLite.Plus Sheng.SQLite.Plus 是一个对直接使用 ADO.NET 方式操作 SQLite ...

  4. 详解升讯威在线客服系统前端 JavaScript 脚本加密技术(1)

    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 这段时间有几个技术小伙伴问了我一个有意思的问题:"你的前端脚本是 ...

  5. 升讯威在线客服系统客服端英文界面的实现方法

    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 最近收到来自巴西客户的需求,希望为客服端增加英文界面. 好,那就满足这个需 ...

  6. 详解升讯威在线客服系统前端多国语言实现技术:原生支持葡文、印尼文、土耳其文、俄文

    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 越来越多的用户向我提出需求,希望为访客端增加更多的界面语言,如葡文.印尼文 ...

  7. 升讯威微信营销系统开发实践:(3)功能介绍与此项目推广过程的一些体会( 完整开源于 Github)...

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

  8. 升讯威微信营销系统开发实践:订阅号和服务号深入分析( 完整开源于 Github)...

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

  9. 升讯威微信营销系统开发实践:(4)源代码结构说明 与 安装部署说明( 完整开源于 Github)...

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

最新文章

  1. 技术图文:如何利用BigOne的API制作自动化交易系统 -- 订单系统
  2. PAT (Advanced Level) 1078. Hashing (25)
  3. linux shell 脚本练习,shell脚本小练习
  4. ssd3 employee.java_SSD3Panswers icarnegie ssd3的所有答案~十分齐全 - 下载 - 搜珍网
  5. 37.使用PreResultListener实现回调
  6. SAP 电商云 Accelerator 和 Spartacus UI 的工作机制差异
  7. 使用建造者模式创建模拟数据
  8. php mongo in 查询语句,PHP 怎么执行mongodb 的 $in 和$size查询
  9. 微信小程序引用php函数,微信小程序Page中data数据操作和函数调用详细介绍
  10. Python使用正则表达式检查书稿中不应该出现的重复字
  11. jenkins教程_4 Docker+SpringCloud
  12. 通过tf的tensorboard可视化训练进度
  13. 【VRP问题】基于狼群算法WPA求解带时间窗车辆路径规划问题(VRPTW)matlab源码
  14. 如何实现数据大屏在各种场景下的时间展示?
  15. C盘空间不足,UE4的deriveddatacache目录位置修改
  16. 公认最好的鸿蒙系统,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  17. 手绘topo图组件 vue + element-ui + jtopo
  18. 核心单词Word List 48
  19. Zeppelin-0.9.0 开启kerberos登陆认证
  20. nginx.exe启动失败?

热门文章

  1. IntelliJ IDEA 的智能编码功能
  2. 软件测试基本方法(二)之白盒测试
  3. 两片74161实现60进制_如何用两片74160来接一个60进制的计数器
  4. 树莓派系统安装步骤——免费工具包资源
  5. Android 导出.vcf格式通讯录方法
  6. C语言递归实现汉诺塔
  7. Java中人工智能的框架
  8. 信息技术课计算机软件的微课,微课在信息技术课程上的有效应用策略研究
  9. 草地排水 改了又改(DCOJ6013)
  10. rocketMQ原理讲解