实体类型的转换? Automapper OR 自定义

在引入了entity framework 之后,系统有了一种新的需求,即对Viewmodel 和model之间的相互转换。

这之间有各种境界。今天拿出来品味一下。

1 用automapper

方法很简单。①添加对automapper的引用

② 在引用的时候,创建两个实体之间的映射关系。我们要做的只是将要映射的两个类型告诉AutoMapper(调用Mapper类的Static方法CreateMap并传入要映射的类型):

<span style="font-family:KaiTi_GB2312;font-size:18px;">    Mapper.CreateMap<StudentViewModel, BasicStudentEntity>();</span>

③实行转换

<span style="font-family:KaiTi_GB2312;font-size:18px;"> BasicStudentEntity enStudent = Mapper.Map<StudentViewModel, BasicStudentEntity>(student);</span>

如果studentviewmodel中有值为空的属性,AutoMapper在映射的时候会把BasicStudentEntity中的相应属性也置为空。当然我所说的是一种最为简单的使用方式。最简单,但是其可用范围也是最小。要求结构完全一致,且字段名也完全相同。很多情况下由于viewmodel 中的一些字段和model的不完全一致。导致我们使用这样的方式,非常不灵活。

其实automapper还有一种使用情况,即字段名不必完全一致。(但是其意义应一致),这样的话我们可以定义类型间的简单映射规则。

<span style="font-family:KaiTi_GB2312;font-size:18px;">1. var map = Mapper.CreateMap<StudentViewModel,BasicStudentEntity>();  
2. map.ForMember(d => d.Name, opt => opt.MapFrom(s => s.SchoolName));  
</span>

但是即便是这样的话,还是不能解决我的另一个问题。那就是当StudentViewModel比BasicStudentEntity 中的字段要多(意义也不一致)的情况下,无法进行转换。

2自定义

这时候我们想到了我们自己转换写的自定义方法。

<span style="font-family:KaiTi_GB2312;font-size:18px;">      #region 3.0.0 学生管理公共方法 将view 转换成model(basicStudent)
        /// <summary>
        /// 学生管理公共方法 将view 转换成model(basicStudent)
        /// </summary>
        /// <param name="enstudentList"></param>
        /// <returns></returns>
        public List<BasicStudentEntity> ChangeViewToBasicstudentModel(List<StudentViewModel> enstudentList)
        {
            List<BasicStudentEntity> studentList = new List<BasicStudentEntity>();
            foreach (var item in enstudentList)
            {

                BasicStudentEntity student = new BasicStudentEntity()
                {

                    StudentID = item.StudentID,
                    StudentNo = item.StudentNo,
                    UserCode = item.UserCode,
                    EntryPartyTime = item.EntryPartyTime,
                    Speciality = item.Speciality,
                    HealthCondition = item.HealthCondition,
                    ExamineeNumber = item.ExamineeNumber,
                    FatherName = item.FatherName,
                    MotherName = item.MotherName,
                    FatherPhone = item.FatherPhone,
                    MotherPhone = item.MotherName,
                    TrainDestination = item.TrainDestination,
                    Note = item.Note,
                    Operator = item.Operator,
                    TimeStamp = item.TimeStamp,
                    CreditCardNo = item.CreditCardNo,
                    Name = item.Name,
                    Sex = item.Sex,
                    PoliticalStatus = item.PoliticalStatus,
                    PreviousName = item.PreviousName,
                    Email = item.Email,
                    CellPhoneNumber = item.CellPhoneNumber,
                    HomeTelephone = item.HomeTelephone,
                    BirthPlace = item.BirthPlace,
                    HomeAddress = item.HomeAddress,
                    Nation = item.Nation,
                    RoomID = item.RoomID,
                    DirectionID = item.DirectionID,
                    ClassID = item.ClassID

                };
                studentList.Add(student);
            }
            return studentList;
        }

        #endregion
</span>

自己的方法还是用着方便一点。如果是底层封装的话,是不是再加上泛型就可以大家共同调用了。这部分没有自己实践。仅供交流。

时间: 2024-07-28 13:07:07

实体类型的转换? Automapper OR 自定义的相关文章

c#自定义类型的转换方式operator,以及implicit(隐式)和explicit (显示)声明的区别

msdn参考:http://msdn.microsoft.com/zh-cn/library/s53ehcz3.aspx http://msdn.microsoft.com/zh-cn/library/z5z9kes2.aspx http://msdn.microsoft.com/zh-cn/library/xhbhezf4.aspx operator 关键字来重载内置运算符,或提供类或结构声明中的用户定义转换.它可以定义不同类型之间采用何种转化方式和转化的结果. operator用于定义类型转

[Hibernate Search] (4) 实体类型的高级映射功能

高级映射 前面介绍的可搜索的域基本上都是字符串类型,实际上可搜索的类型是非常丰富的. 本文会介绍以下几个方面的内容: Lucene对实体进行索引的过程 借助Solr组件对这个过程的改进 修改域的重要程度,从而让基于相关度的排序更加有意义 动态决定是否对一个实体类型进行索引 桥接器(Bridges) 实体类型中可以使用的类型是无穷无尽的,但是对于Lucene索引而言,任何类型归根到底都会以字符串来表示.所以,在对实体的域进行索引时,这些域最终需要被转换为字符串类型的对象. 在Hibernate S

【读书笔记】C#高级编程 第七章 运算符和类型强制转换

(一)运算符 类别 运算符 算术运算符 + - * / % 逻辑运算符 & | ^ ~ && || ! 字符串连接运算符 + 增量和减量运算符 ++ -- 移位运算符 << >> 比较运算符 == != < > <= >= 赋值运算符 = += -= *= /= %= &= |= ^= <<= >>= 成员访问运算符(用于对象和结构) . 索引运算符(用于数组和索引器) [] 类型转换运算符 () 条件

《C#高级编程》【第7章】运算符与类型强制转换 -- 学习笔记

       运算符编程语言的基本元素,它使得我们的代码更加的简洁明了.然而我们为了解决操作数类型不同的问题,我们又有引入了强制转换的概念.我们先看看本章的内容构成吧. 1.运算符 我们来看看一些常见的运算符: <1>条件运算符 其语法如下: Condition ? true_Expression : false_Expression 当条件Condition为真时,其将执行true_Expression,否则执行false_Expression. <2> checked 和

Unicode环境下完成CString向string类型的转换

CString是MFC的字符串类,它不是基本类型,而是对字符串的封装,它是自适应的,在UNICODE环境下就是CStringW,在非UNICODE环境下就是CStringA. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Hibernate应用SQL查询返回实体类型

Hibernate应用SQL查询返回实体类型 Hibernate使用SQL查询返回实体类型 以前,使用SQL查询,结果放在 RS 结果集中,还要去转换影射到Java类中.Hibernate中,可以自动帮我们注入到Hibernate 甚至是 非 Hibernate 类型当中. String sql = "select * from T_TMP_PUBLIC_POLICY TP"; SQLQuery sqluery = session.createSQLQuery(sql).addEnti

蓝鸥零基础学习HTML5第七讲 常见标签及标签类型的转换

蓝鸥零基础学习HTML5第七讲 常见标签及标签类型的转换 1.常见标签-块属性的标签 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="css/reset.css"> </head> <

SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换

SpringMVC表单或Json中日期字符串与JavaBean的Date类型的转换 场景一:表单中的日期字符串和JavaBean的Date类型的转换 在使用SpringMVC的时候,经常会遇到表单中的日期字符串和JavaBean的Date类型的转换, 例如,如下代码S_ROLE_QO这个bean中包含有Date类型属性,不处理就拿不到值. /** * 分页取角色列表 * @param s_ROLE_QO 角色查询条件 * @return */ @RequestMapping(value = "/

mysql 字段类型VARCHAR转换成DECIMAL

在我们写代码的实际业务中,有时候实体类用的是String,数据库中自然是VARCHAR类型,但是如果这个实体的属性值放的是数字类型,你查询的时候又需要对它进行排序.sql怎么写呢. 别担心mysql提供了转换方法:CAST  ,CONVERT 例如:我把VARCHAR类型的价格 转换成DECIMAL 然后再进行排序       1.select  price from TABLE  order by CAST (price as DECIMAL) desc 2.select  price fro