在项目中一直在使用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. 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57ff5932cde42f1f03de29b1 本文来源: 微信客户端开发团队 ...

  2. AndroidPn源码分析(一)

    好了,开始研究源码了.目前对androidpn,只限于使用过它,跑了一下demo.现在开始研究一下源码. (一)入口 当服务器端启动的时候,控制台会打印一些log,除了spring和hibernate ...

  3. Rabbitmq基本原理

    MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订阅队列 ...

  4. Android 综合揭秘 —— 全面剖释 Service 服务

    引言 Service 服务是 Android 系统最常用的四大部件之一,Android 支持 Service 服务的原因主要目的有两个,一是简化后台任务的实现,二是实现在同一台设备当中跨进程的远程信息 ...

  5. ios 使用UINavagationController时,push,pop方法执行的一些方法

    (一)当创建某一个UIViewController B,并push到ViewController B时,B执行方方法的顺序如下: 1>viewDidLoad2>initWithNibNam ...

  6. 从零开始用gulp

    gulp是基于流的前端构件化工具.目前比较火的前端构建化工具还是挺多的,grunt gulp fis3等等. 这个鬼东西有什么用?请参考https://www.zhihu.com/question/3 ...

  7. 每天一个linux命令(51):lsof命令

    lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控制协议 ...

  8. EF架构~DefaultValue让我的UnitOfWork更可读

    回到目录 在编程世界里,使用“否定式”不是一件好事,因为它的可读性并不高,但有时,为了让使用者减少代码量,还是使用了双重否定,直到DefaultValue的出现,它改变了这一切,它可以为你的属性设置你 ...

  9. 关于STM32的外部引脚中断的问题

    今天想用自己以前的比较干净的工程模板做一个东西,,,,,,,在添加上引脚中断的时候,,突然想知道自己配置的中断优先级是否正确执行,,,,, 以前刚学习32的时候测试过是可以的,,不过今天发现了一个大问 ...

  10. javascript for..in 知识

        JavaScript 中for...in...,一直在代码中使用,最初认为,for xx in obj||array 对于arry就xx对应为数组索引,对于obj来说xx对应就是obj中的pr ...