项目中用到了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

最新文章

  1. CDH离线数据导入solr:利用MapReduceIndexerTool将json文件批量导入到solr
  2. Java深度历险(五)——Java泛型
  3. 给各位聚聚和大大介绍一个开源项目 Expression2Sql(转)
  4. 如何建立一个完整的游戏AI
  5. PHP魔术方法在框架中的应用
  6. c++ template函数的声明和实现需要在同一个文件中
  7. zw版【转发&#183;台湾nvp系列Delphi例程】HALCON ObjToInteger1-4
  8. OS开发拓展篇—应用之间的跳转和数据传
  9. Delphi 编写的Web Service
  10. NSFileHandle编写json数据格式
  11. readline与readlines不能同时使用
  12. 谈谈java的BlockingQueue
  13. GIF动态图制作
  14. Linux环境变量配置全攻略
  15. [转载]C# TimeSpan 计算时间差(时间间隔)
  16. php调用API支付接口 转至http://www.cnblogs.com/chaochao00o/p/6490463.html
  17. js使用中的小问题----textarea是否有value属性
  18. 使用Maven+ssm框架搭建一个web项目
  19. bootstrap基础学习小记(一)简介模板、全局样式
  20. 初探C++类模版学习笔记

热门文章

  1. 阿里企业邮箱smtp设置
  2. 【转载】C#中List集合SingleOrDefault和FirstOrDefault方法有何不同
  3. 浅谈javascript中的递归和闭包
  4. js 数组的深度拷贝 的四种实现方法
  5. Centos7 docker安装GitLab
  6. Mysql 存储过程 + python调用存储过程 (内置函数讲解及定义摘抄)
  7. SQL SERVER-Exclusive access could not be obtained because the database is in use. (Microsoft.SqlServer.SmoExtended)
  8. linux系统编程之信号(六)
  9. linux简单的命令
  10. vbs剪切Excel某一行