手撸ORM浅谈ORM框架之Update篇
快速传送
手撸ORM浅谈ORM框架之Delete篇
手撸ORM浅谈ORM框架之Query篇
后续待定。。。。。。
前人栽树,后人乘凉
BaseRepository-》GetCurrentTableName、GetExcludeKeyAllFields已经在《手撸ORM浅谈ORM框架之Add篇》BaseRepository里面的方法,不重复搬砖了。
承上启下,传递希望
BaseRepository-》GetKey获取表主键,目前自动递增主键使用的KeyAttribute标识自动递增主键,更新不需要区分主键类型获取当前实体所有的主键作为where更新条件;如果项目中需要使用复合主键、指定主键(按照业务单元生成的业务所需主键,例如: SN2020102600001等),获取Key的方法加入自定义的xxxAttribute作为条件之一,来满足当前的业务需要;
1 /// <summary>
2 /// get key-atttribute
3 /// </summary>
4 /// <returns>return key-attribute</returns>
5 private List<PropertyInfo> GetKey()
6 {
7 List<PropertyInfo> list = new List<PropertyInfo>();
8 PropertyInfo[] properties = typeof(T).GetProperties();
9 foreach (var item in properties)
10 {
11 if (item.CustomAttributes.Any(c => c.AttributeType.Name == nameof(KeyAttribute)))
12 {
13 list.Add(item);
14 }
15 }
16 return list;
17 }
BaseRepository-》GetUpdateSql来来来Sql出现了(提高性能可以优化,缓存当前项目所有表的增删查改Sql语句)
1 /// <summary>
2 /// get update sql
3 /// </summary>
4 /// <param name="entity"></param>
5 /// <returns></returns>
6 private string GetUpdateSql(T entity)
7 {
8 string tableName = GetCurrentTableName();
9 StringBuilder stringBuilder = new StringBuilder();
10 List<PropertyInfo> properties = GetExcludeKeyAllFields();
11 foreach (var item in properties)
12 {
13 stringBuilder.AppendFormat("{0}=@{0},", item.Name);
14 }
15 stringBuilder.Remove(stringBuilder.Length - 1, 1);
16 stringBuilder.Append(" WHERE ");
17 List<PropertyInfo> propertyKeys = GetKey();
18 foreach (var propertyKey in propertyKeys)
19 {
20 stringBuilder.AppendFormat("{0}=@{0} AND ", propertyKey.Name);
21 }
22 stringBuilder.Remove(stringBuilder.Length - 4, 4);
23 return string.Format("UPDATE {0} SET {1}", tableName, stringBuilder);
24 }
BaseRepository-》泛型Update;
1 /// <summary>
2 /// udpate entity
3 /// </summary>
4 /// <param name="entity">entity</param>
5 /// <returns>return true or false</returns>
6 public bool Update(T entity)
7 {
8 string sql = GetUpdateSql(entity);
9 MySqlParameter[] parameters = GetMySqlParameters(entity.GetType().GetProperties(), entity);
10 int row = context.Database.ExecuteSqlRaw(sql, parameters);
11 return row > 0 ? true : false;
12 }
实操Repository方法泛型约束;
1 public bool Update(Learn_Student learnStudent)
2 {
3 using (MySqlDbContext mySqlDbContext = new MySqlDbContext())
4 {
5 BaseRepository<Learn_Student> baseRepository = new BaseRepository<Learn_Student>(mySqlDbContext);
6 return baseRepository.Update(learnStudent);
7 }
8 }
注:learn-orm-net目前只是作为学习ORM框架原理的Demo,项目会做出一定的优化处理,但不能直接拿来在项目中使用,毕竟现在NET Framework、NET Core已经有很多优秀的ORM框架,NET下一次发布就是只有一个版本了,我们没有必要重复造轮子,造轮子是因为没有现成的优秀的轮子可用。
代码下载地址: SourceCode 作者水平有限欢迎园友纠正错误及不恰当之处,予以及时修正以免误导他人!
手撸ORM浅谈ORM框架之Update篇的更多相关文章
- 手撸ORM浅谈ORM框架之基础篇
好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...
- 手撸ORM浅谈ORM框架之Add篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Delete篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸ORM浅谈ORM框架之Query篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- 手撸基于swoole 的分布式框架 实现分布式调用(20)讲
最近看的一个swoole的课程,前段时间被邀请的参与的这个课程 比较有特点跟一定的深度,swoole的实战教程一直也不多,结合swoole构建一个新型框架,最后讲解如何实现分布式RPC的调用. 内容听 ...
- 【SSH学习笔记】浅谈SSH框架
说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...
- 浅谈chainer框架
一 chainer基础 Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架. 这篇博文会通过一些例子简要地介绍一下Chainer,同时把它与其他一些框架做比较,比如Caffe.The ...
- 浅谈ORM操作
2. ORM(对象关系映射) 1. 映射的关系 DB ORM 数据表 <--> 类 数据行 <--> 对象 字段 <--> 属性 2. Django项目使用MySQ ...
- 【带你手撸Spring】没有哪个框架开发,能离开 Spring 的 FactoryBean!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老司机,你的砖怎么搬的那么快? 是有劲?是技巧?是后门?总之,那个老司机的代码总是可 ...
随机推荐
- odoo13之在odoo中添加自定义页面
注: 本博文是阅读Ruter博客 在odoo中添加自定义页面 后所做的个人总结,以及博文搬迁,主要是便于自己的后期理解:大部分内容为搬运,当然也包括自己的一些总结和流程优化. 前言 首先展示效果:进入 ...
- Docker:二、开始部署第一个Asp.net应用
各位看官大家好,接着上一篇,我们构建自己的镜像文件成功之后,准备开始部署自己的第一个docker应用了... 接着上文,我们构建自己的镜像,如下是Dockerfile文件 #引入运行环 ...
- php bypass disable function
前言 最近开学,事太多了,好久没更新了,然后稍微闲一点一直在弄这个php bypass disable function,一开始自己的电脑win10安装蚁剑的插件,一直报错.怀疑是必须linux环境. ...
- Tomcat学习小记(一)
1.Tomcat概述 Tomcat 服务器是一个开源的轻量级Web应用服务器,擅长处理动态资源,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet.JSP 程序的首选. Tomcat ...
- 基于gis的系统开发,程序运行出现问题 ArcGIS product not specified.You must first bind to an ArcGIS version prior to using any ArcGIS components.
在之前初始化的时候添加下面的一行代码:ESRI.ArcGIS.RuntimeManager.Bind(ESRI.ArcGIS.ProductCode.EngineOrDesktop);还需要添加一个引 ...
- Python-通过实例方法调用-统一接口的实现-getter methodcaller
某项目中,我们的代码使用的2个不同库中的图形类: Circle,Triangle 这两个类中都有一个获取面积的方法接口,但是接口的名字不一样 统一这些接口,不关心具体的接口,只要我调用统一的接口,对应 ...
- MyBatis 进阶,MyBatis-Plus!(基于 Springboot 演示)
这一篇从一个入门的基本体验介绍,再到对于 CRUD 的一个详细介绍,在介绍过程中将涉及到的一些问题,例如逐渐策略,自动填充,乐观锁等内容说了一下,只选了一些重要的内容,还有一些没提及到,具体可以参考官 ...
- 中部:执具 | R语言数据分析(北京邮电大学)自整理笔记
第5章工欲善其事.必先利其器 代码,是延伸我们思想最好的工具. 第6章基础编程--用别人的包和函数讲述自己的故事 6.1编程环境 1.R语言的三段论 大前提:计算机语言程序=算法+数据结构 小前提:R ...
- 64位Win7下H3C的iMC无法查看“网络拓扑”的解决方法、心路历程
64位Win7下H3C的iMC无法查看"网络拓扑"的解决方法.心路历程
- frp内网穿透
原理 frp(fast reverse proxy)分为Server端和Client端,Server端安装在带有公网IP的服务器上,Client安装在内网环境但能上网的普通PC中. 流程: Serve ...