在项目中一直在使用Auto Mapper技术,但是只是会简单的使用,对其里面的一些具体的细节和知识点不是很清楚,现在就跟着我从最基础的知识点来重新认识下,AutoMapper技术吧。

Auto Mapper是一种能够将两个不同类直接做mapping的方法,可以直接从Vmodel到Dmodel做存储的。这个是双向的,老大之前一直用VO(前台View视图)---PO(数据库中的模型,相当于领域模型)来表示,我也觉得这样很容易理解。

为什么需要Auto Mapper?前台我们可以直接使用实体的模型的,干嘛多此一举呢。

理由:我们后台的模型是根据数据库中表的结构和业务中需要的内容进行设计的,但是前台我们不可能直接就使用,如果直接使用的话将来后台表结构变化就需要前后一起修改,这样工程量就就大了,现在我们定义前台的Vmodel,我们需要展示什么数据就定义什么,接着我们将我们需要转换的利用Auto Mapper一对一进行转换,要是时间常了业务发生了变化,需要修改数据库的模型,我们直接修改后台的模型就可以解决问题,至于前台的我们就不需要发生太大的改变。这大概就是auto mapper的作用吧。

DTO(贫血模型):是一种设计模式之间传输数据的软件应该系统。数据传输目标往往是数据访问对象从数据库中检索数据。(这个我看了半天还是不懂,在项目中就只是将实体的Model转换为界面视图的Model,相反也行),下面是我摘抄的,感觉不是很理解。

表现层与应用层之间是通过数据传输对象(DTO)进行交互的,数据传输对象是没有行为的POCO对象,它的目的只是为了对领域对象进行数据封装,实现层与层之间的数据传递。为何不能直接将领域对象用于数据传递?因为领域对象更注重领域,而DTO更注重数据。不仅如此,由于“富领域模型”的特点,这样做会直接将领域对象的行为暴露给表现层。

现在先不管是否将领域对象的行为暴露给表现层,这个还不是很理解,先来学习如何进行转换的,具体有哪些步奏需要做。

1:我们先需要在项目中引用“AutoMapper.dll”

在程序包管理控制台输入”Install-Package AutoMapper”这样就可以将这个安装到项目中。

2:配置需要转换的两个类。

3:验证映射是否正确。

4:执行映射。

        static void Main(string[] args)
{
using(var db=new BlogEntities() )
{
//通过linq来从数据库中取到数据。
var blog = from s in db.Blog where s.BlogTitle == "程序" select s;
var model = new Model();
//配置AutoMapper
Mapper.CreateMap<Blog, Model>();
//验证AutoMapper映射是否正确
Mapper.AssertConfigurationIsValid();
foreach (var item in blog)
{
//执行映射
Mapper.Map(item, model);
Console.WriteLine(model.BlogContext);
}
Console.WriteLine("OK");
Console.ReadKey();
}
}

这样我们就可以通过model点击出来博客的内容了。

*:特定的场景下使用AutoMapper

我们先看下我们的俩个类

   public  class Model
{
public string BlogTitle { get; set; }
public string BlogContext { get; set; }
public DateTime CreateDate { get; set; }
public string BlogAuther { get; set; }
public int CateId { get; set; }
}
    /// <summary>
/// 数据库中的实体类
/// </summary>
public partial class Blog
{
public int BlogId { get; set; }
public string BlogTitle { get; set; }
public string BlogContext { get; set; }
public System.DateTime CreateDate { get; set; }
public string BlogAuther { get; set; }
public int CateId { get; set; }
public string BlogLong { get; set; } public virtual BCategorical BCategorical { get; set; }
}

这里可以完成映射是应为我们俩个类的中的名字是一样的,我们将其类交给AutoMapper,它会将对应的名称之间进行转换。要是名称不一样,比如下面这样。

        public string BlogCon { get; set; }

这里我们将Blog的博客内容修改下,就会出现错误。我们可以这样进行手工的配置,让其blogContext将来映射到BlogCon中。

                //配置AutoMapper
Mapper.CreateMap<Blog, Model>().ForMember(x=>x.BlogCon,mo=>mo.MapFrom(x=>x.BlogContext));

这样就可以了。

错误提示:

“AutoMapper.AutoMapperMappingException”类型的第一次机会异常在 AutoMapper.dll 中发生

这个是经常出现的,最大的可能就是我们VO—PO的名称不一样,或者二者的类型是不一样的,还有就是可能从数据库取到的数据有的值为空。这样就会提示出现错误。

附件:

http://www.cnblogs.com/daxnet/archive/2010/07/07/1772584.html

http://www.cnblogs.com/dudu/archive/2011/12/16/2284828.html

http://www.cnblogs.com/xishuai/p/3700052.html

Auto Mapper01的更多相关文章

  1. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  2. overflow:hidden与margin:0 auto之间的冲突

    相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.

  3. Android Auto开发之一《开始学习Auto 》

    共同学习,共同进步, 转载请注明出处.欢迎微信交流:sfssqs,申请注明"Android Car"字样 ================= =================== ...

  4. width:100%;与width:auto;的区别

    <div> <p>1111</p> </div> div{ width:980px; background-color: #ccc; height:30 ...

  5. SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)(1)

    很多人对Xpath可能比较熟悉,但不知道有没有直接操作过数据库,我们都知道 在Sql2005里公支持的几种查询有Raw,Auto模式,页并没有Path和Elements用法等,如果在2000里使用过 ...

  6. margin:0 auto;不居中

    margin:0 auto:不居中可能有以下两个的原因; 1.没有设置宽度<div style="margin:0 auto;"></div>看看上面的代码 ...

  7. 初学C++ 之 auto关键字(IDE:VS2013)

    /*使用auto关键字,需要先赋初值,auto关键字是会根据初值来判断类型*/ auto i = ; auto j = ; cout << "auto i = 5" & ...

  8. C++11 - 类型推导auto关键字

    在C++11中,auto关键字被作为类型自动类型推导关键字 (1)基本用法 C++98:类型 变量名 = 初值;   int i = 10; C++11:auto 变量名 = 初值;  auto i ...

  9. 为什么 "auto a = 1;" 在C语言中可以编译通过?

    参照:这里 这让我想起之前看的一部书, int i; 其实是等价与 auto int i; 表示为局部变量 这应该与static是相对的吧?

随机推荐

  1. GitHub详解(GitHub for Windows)

    GitHub详解 GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目.它由GitHub公司(曾称Logical Awesome)的开发者Chris Wanstrath ...

  2. Powershell--批量拆分SQL语句为事务并批处理

    作为DBA,时不时会遇到将数据导入到数据库的情况,假设业务或研发提供一个包含上百万行INSERT语句的脚本文件,而且这些INSERT 语句没有使用GO来进行批处理拆分,那么直接使用SQLCMD来执行会 ...

  3. python 对象

    python 对象 在python中,对象就是为C中的结构体在堆上申请的一块内存,一般来说,对象是不能被静态初始化的,并且不能再栈空间上生存.本文主要对Python的基本数据类型做简单的介绍. PyO ...

  4. MYSQL 大文件无法导入的问题。

    1. 设置maxpacket. 要在[mysqld]标签下.这个疏忽了,就会发现没效果. 基本网上的都没说清,要看stackoverflow. Change in the my.ini file. I ...

  5. redis系列-主从复制

    redis自身提供了主从的机制,通过配置可以实现服务的备份(Master->Slave). 配置项 slaveof <masterip> <masterport> mas ...

  6. Java使用snakeyaml解析yaml

    YAML Yaml是一种"是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言."类似于XML但比XML更简洁,语法详见 http://www.ruan ...

  7. java 锁2

    并发,其实是多线程才有的场景... java 多线程? 锁? 现在看来,即使已经工作了4.5年,这仍然不是一个简单的问题. 其实java 本身有提供锁的机制. 比如 Object对象的 wait .n ...

  8. G2 DT时代的图形语法 正式发布

    G2有一个高大上的名字叫做:The Grammar Of Graphics——图形语法.它是一个强大的语义化图表生成工具,它提供了一整套图形语法,可以让用户通过简单的语法搭建出无数种图表,并且集成了大 ...

  9. 咱们来聊聊JS中的异步,以及如何异步,菜鸟版

    为什么需要异步?why?来看一段代码. 问题1: for(var i=0;i<100000;i++){ } alert('hello world!!!'); 这段代码的意思是执行100...次后 ...

  10. UML基础系列:用例图

    1. 概述 用例图(Use Case Diagram)描述“用户.需求.系统功能单元”之间的关系,是参与者所能观察和使用到的系统功能模型图. 用例图用于需求分析阶段 用例图包含6个基本元素:参与者(A ...