在项目中一直在使用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. WPF 窗口自适应

    窗口自适应就是说,当主窗口缩放的时候,内部的控件位置自动的调整,而不是隐藏掉.这主要依赖于Grid布局. 1.比如这个groupbox 本身是在一个Grid的Row中的.缩放之后,左边的button不 ...

  2. 使用decode函数实现统计

          从上个星期起就在开始做统计图,各种统计图,昨天做的统计效果图如下:       在这里要根据工作平台和机构做统计,其中当字段A等于某个值时需要统计起来,也就是说假设等于2时需要做统计,字段 ...

  3. 【译】什么导致了Context泄露:Handler&内部类

    思考下面代码 public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Hand ...

  4. 浏览器 的 session 如何保持?!

    http://qindingsky.blog.163.com/blog/static/3122336200832853116360/ 在谈论session机制的时候,常常听到这样一种误解“只要关闭浏览 ...

  5. flex 阅读器

    遇到很多的困难 首先是 pdf2swf 而后又下载swftools 而后有swfcombine.exe 让制作的swf 文字可选? —— 这应该是很常见的需求啊! 可是我搜索来搜索去都找不到... 搜 ...

  6. Java连接Oracle数据库开发银行管理系统【三、实现篇】

    说明:里面的主要代码都加的有注释部分,所以代码显得很长,如果有错误的地方,谢谢指出. 注意需要导入数据库jar包 ------------------------------------------- ...

  7. Atiit 如何手写词法解析器

    Atiit 如何手写词法解析器 1.1. 通过编程直接从正则->nfa->dfa->表驱动词法解析一条龙自动生成.那是用程序自动生成是需要这样的,自己手写完全不必要这么复杂1 1.2 ...

  8. Atitit cms wordpress get_post  返回的WP_Post 规范 标准化

    Atitit cms wordpress get_post  返回的WP_Post 规范 标准化 public $ID; public $post_author = 0; * The post's l ...

  9. Atitit 泛型原理与理解attilax总结

    Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...

  10. Atitit paip.对象方法的实现原理与本质.txt

    Atitit paip.对象方法的实现原理与本质.txt 对象方法是如何实现的1 数组,对象,字典1 对象方法是如何实现的 这显然是一个对象方法调用.但对象方法是如何实现的呢?在静态语言中,因为有编译 ...