Auto Mapper01
在项目中一直在使用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的更多相关文章
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- overflow:hidden与margin:0 auto之间的冲突
相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.
- Android Auto开发之一《开始学习Auto 》
共同学习,共同进步, 转载请注明出处.欢迎微信交流:sfssqs,申请注明"Android Car"字样 ================= =================== ...
- width:100%;与width:auto;的区别
<div> <p>1111</p> </div> div{ width:980px; background-color: #ccc; height:30 ...
- SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)(1)
很多人对Xpath可能比较熟悉,但不知道有没有直接操作过数据库,我们都知道 在Sql2005里公支持的几种查询有Raw,Auto模式,页并没有Path和Elements用法等,如果在2000里使用过 ...
- margin:0 auto;不居中
margin:0 auto:不居中可能有以下两个的原因; 1.没有设置宽度<div style="margin:0 auto;"></div>看看上面的代码 ...
- 初学C++ 之 auto关键字(IDE:VS2013)
/*使用auto关键字,需要先赋初值,auto关键字是会根据初值来判断类型*/ auto i = ; auto j = ; cout << "auto i = 5" & ...
- C++11 - 类型推导auto关键字
在C++11中,auto关键字被作为类型自动类型推导关键字 (1)基本用法 C++98:类型 变量名 = 初值; int i = 10; C++11:auto 变量名 = 初值; auto i ...
- 为什么 "auto a = 1;" 在C语言中可以编译通过?
参照:这里 这让我想起之前看的一部书, int i; 其实是等价与 auto int i; 表示为局部变量 这应该与static是相对的吧?
随机推荐
- .net开发笔记(十六) 对前部分文章的一些补充和总结
补充有两个: 一个是系列(五)中讲到的事件编程(网址链接),该文提及到了事件编程的几种方式以及容易引起的一些异常,本文补充“多线程事件编程”这一块. 第二个是前三篇博客中提及到的“泵”结构在编程中的应 ...
- .net开发笔记(十八) winform中的等待框
winform中很多任务是需要在后台线程(或类似)中完成的,也就是说,经常容易涉及到UI界面与后台工作线程之间的交互.比如UI界面控制后台工作的执行(启动.暂停.停止等),后台工作进度在UI界面上的显 ...
- 区分各浏览器的CSS hack(包括360、搜狗、opera)
虽然说使用css hack来解决页面兼容性bug并不是个好办法,但是有时候这些hack还是用的着的,比如你接受了一个二手或是三手的遗留界面,杂乱无章的css代码,只在某个浏览器下有兼容bug,而且需要 ...
- Android SDK content Loader has encountered a problem.parseSdkContent failed
打开Eclipse,弹出Android SDK content Loader has encountered a problem.parseSdkContent failed,当点击detail按钮, ...
- Springlake-01 介绍&功能&安装
1. 简介与功能 1)Springlake 是一个企业内容平台SECP 2)是一个可配置的系统,80%内容可以配置 3)允许建立和配置垂直解决方案 4)敏捷和占用空间小,可伸缩 5)端到端的安全性与性 ...
- Java连接Oracle数据库开发银行管理系统【二、设计篇】
一.总体分析 此系统的实现并不难,但是如何更好的设计出实现方式还是需要更深入的分析,例如:如果再增加其他功能,是不是需要变动的 代码很少,只是直接再增加一点功能就可以了呢?如果使用的不是Ora ...
- 爱上MVC~在Views的多级文件夹
回到目录 在MVC里,你的控制器对应的视图一般是在Views目录,而如果希望在Views里再分几个模块文件夹默认是不允许的,我们需要做一下设置,就可以实现Views下的多次文件夹层次了,例如,我们有产 ...
- 描述一下C#中索引器的实现过程,是否只能根据数字进行索引?
不是.可以用任意类型. 索引器是一种特殊的类成员,它能够让对象以类似数组的方式来存取,使程序看起来更为直观,更容易编写. 1.索引器的定义 C#中的类成员可以是任意类型,包括数组和集合.当一个类包含了 ...
- cordova 版本
cordova 版本 npm install cordova@xxxx https://travis-ci.org/apache/cordova-cli https://www.npmjs.com/p ...
- Python的枚举类型
Python的 Python的没有我们有两种用法: 创建Enum的实例 创建Enum的subclass 创建Enum的实例 from enum import Enum, unique Month = ...