快速传送

手撸ORM浅谈ORM框架之基础篇

手撸ORM浅谈ORM框架之Add篇

手撸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篇的更多相关文章

  1. 手撸ORM浅谈ORM框架之基础篇

    好奇害死猫 一直觉得ORM框架好用.功能强大集众多优点于一身,当然ORM并非完美无缺,任何事物优缺点并存!我曾一度认为以为使用了ORM框架根本不需要关注Sql语句如何执行的,更不用关心优化的问题!!! ...

  2. 手撸ORM浅谈ORM框架之Add篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  3. 手撸ORM浅谈ORM框架之Delete篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  4. 手撸ORM浅谈ORM框架之Query篇

    快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...

  5. 手撸基于swoole 的分布式框架 实现分布式调用(20)讲

    最近看的一个swoole的课程,前段时间被邀请的参与的这个课程 比较有特点跟一定的深度,swoole的实战教程一直也不多,结合swoole构建一个新型框架,最后讲解如何实现分布式RPC的调用. 内容听 ...

  6. 【SSH学习笔记】浅谈SSH框架

    说在前面 本学期我们有一门课叫做Java EE,由陈老师所授,主要讲的就是Java EE 中的SSH框架. 由于陈老师授课风格以及自己的原因导致学了整整一学期不知道在讲什么,所以才有了自己重新学习总结 ...

  7. 浅谈chainer框架

    一 chainer基础 Chainer是一个专门为高效研究和开发深度学习算法而设计的开源框架. 这篇博文会通过一些例子简要地介绍一下Chainer,同时把它与其他一些框架做比较,比如Caffe.The ...

  8. 浅谈ORM操作

    2. ORM(对象关系映射) 1. 映射的关系 DB ORM 数据表 <--> 类 数据行 <--> 对象 字段 <--> 属性 2. Django项目使用MySQ ...

  9. 【带你手撸Spring】没有哪个框架开发,能离开 Spring 的 FactoryBean!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老司机,你的砖怎么搬的那么快? 是有劲?是技巧?是后门?总之,那个老司机的代码总是可 ...

随机推荐

  1. synchronized和lock的作用与对比

    一.synchronized的作用 synchronized是java中的一个关键字,用于线程同步.1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象 ...

  2. st表、RMQ和LCA

    int lca(int x,int y) { if(de[x]<de[y]) swap(x,y); int d=de[x]-de[y]; for(int i=log2(d);i>=0;i- ...

  3. spring多模块之间的调用

    https://blog.csdn.net/tomcat_2014/article/details/50206197?locationNum=5

  4. Centos-对比文件差异-diff

    diff 比较文件差异 相关选项 -c 显示全部内容,并标记不同之处 -b 忽略行尾空格,并认为字符串中一个或多个空格视为相同 -r  当比较双方都是目录时,会比较子目录中的文件 -s 当两个文件相同 ...

  5. C#编写一个较完整的记事本程序

    开发环境 Visual Studio 2019 至少需安装 .NET桌面开发 创建项目并配置 创建窗体文件 配置项目名称及框架 设计界面 创建窗体文件,将控件摆放位置如下,参考系统自带的记事本程序 窗 ...

  6. LNMP架构介绍与部署

    一.LNMP架构介绍 LNMP:Linux系统下Nginx+MySQL+PHP这种网站服务器架构.Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器.My ...

  7. WSL2 bug

    错误现象 Stdout: Stderr: 2020/05/27 20:01:37 resolving /mnt/host/c/Program Files/Docker/Docker/resources ...

  8. 2014年 实验一  C2C个人拍卖

    实验一  C2C个人拍卖 --实战淘宝 [实验目的] 掌握网上拍卖的基本流程和拍卖平台的运营 [实验条件]⑴.个人计算机一台 ⑵.计算机通过局域网形式接入互联网. ⑶.常用浏览器. [知识准备] 本实 ...

  9. 多测师讲解 _接口自动化框架设计分层思想(001)_高级讲师肖sir

    第一层: 第二层:调用接口层 VOQGWBZYNBOAVZGE

  10. 多测试_mysql数据库_09

    什么是数据库? 是存放数据的电子仓库.以某种方式存储百万条,上亿条数据,供多个用户访问共享. 每个数据库都有一个或多个不同的api用于创建.访问,管理和复制所保存的数据. 数据库分关系型数据库和非关系 ...