Dto2Entity,WCF+ADO.EF数据传输对象和实体对象转换
DTO(Data transfer object):
数据传输对象 专门用来传输的数据对象,只包含有可读写的属性,不包含任何方法;在WCF中使用时属性DataMember标记,对象自己用DataContract标记。比如我们一张表有100个字段,那么对应的PO就有100个属性。但是我们界面上只要显示10个字段,客户端用获取数据,没有必要把整个PO(persistant object持久对象,使用EF时就是EntityObject)对象传递到客户端,这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构.到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO(ViewObject表现层对象)。
如果在使用WCF时使用DTO,那么必然会遇到dto 和 entity转换的问题,每回手写转换好累啊。尝试着写个通用的方法来实现,以前看到过这个思路,但是当时忘记摘录下来备用,那么自己动手实现了。请看详情,有更好的办法和建议请留言。
/// <summary> /// Dto对象转Entity,只是复制属性,dto的属性要比entity少2个哦。 /// </summary> /// <typeparam name="T">EntityObject</typeparam> /// <param name="dto">dto对象</param> /// <returns>EntityObject对应的实例</returns> public EntityObject ConvertToEntityObject<T>(object dto) where T : EntityObject { Type dtoEntity = dto.GetType(); var piList = dtoEntity.GetProperties().Where(p => p.PropertyType.IsPublic == true).ToList(); Assembly assembly = Assembly.GetAssembly(typeof(T)); object resultObj = assembly.CreateInstance(string.Join(".",new string[]{typeof(T).Namespace,typeof(T).Name})); var piResultObj = resultObj.GetType().GetProperties().Where(p => p.PropertyType.IsPublic == true).ToList(); foreach (System.Reflection.PropertyInfo pi in piList) { var sourcePi = piResultObj.Single(p => p.Name == pi.Name); if (sourcePi != null) { object value = pi.GetValue(dto, null); sourcePi.SetValue(resultObj, value, null); } } return resultObj as EntityObject; }
使用:
public bool AddUserEntity(MainAppDataAccess.DTO.SystemOperatorDto userDto) { try { using (AuthorityDbEntities db = new AuthorityDbEntities()) { db.SysOperator.AddObject(ConvertToEntityObject<SysOperator>(userDto) as SysOperator); db.SaveChanges(); } return true; } catch (Exception ex) { LogHelper.Error(ex); return false; } }
作者:数据酷软件
出处:https://www.cnblogs.com/datacool/archive/2012/06/19/Dto2Entity.html
关于作者:20年编程从业经验,持续关注MES/ERP/POS/WMS/工业自动化
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
联系方式: qq:71008973;wx:6857740733
基于人脸识别的考勤系统 地址: https://gitee.com/afeng124/viewface_attendance_ext
自己开发安卓应用框架 地址: https://gitee.com/afeng124/android-app-frame
WPOS(warehouse+pos) 后台演示地址: http://47.239.106.75:8080/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构