实体类型的转换? 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>


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



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。