基于net6的简单ORM编码实现
本文手把手实现一个简单的ORM框架,仅作为学习,免去多余的功能,力求简单。本文使用VS2022,数据库是MS SQL Server。
一、 什么是ORM?
ORM即对象关系映射,英文叫:Object-Relational Mapping。它的作用是在将关系型数据库中的数据表和业务实体类之间作一个映射。ORM使得我们只需操作对象的方法和属性,即可完成对数据库的增删查改,避免了与复杂繁琐的SQL语句打交道。
ORM隐藏了访问数据库的细节,使得新手可以简单地操作数据库,但同时有些好学的技术人员希望了解ORM到底是怎么实现的。
二、 ORM实现原理
我们都知道,操作数据库需要编写SQL语句,SQL语句有增删查改事务存储过程等。SQL语句都有固定的要求格式,而语句中的字段则是根据数据表字段的不同而不同。
(1)定义一个类,此类的属性与数据表的字段一一对应。
(2)利用C#中的反射,获得类的字段名称,类名等信息。
(3)当要向数据库新增数据时,将字段名、类名组装成SQL语句,再连接数据库进行执行,其他删除、查询、修改的操作也类似。
三、 准备工作-创建数据表scheduleList
本实例使用VS2022,基于NET6,microsoft SQL Server 2012。新建一数据库,名称随意,并新建一数据表,名称scheduleList。有三个字段ID、title、和createTime,分别表示是主键ID,标题和创建时间。
四、定义scheduleList类
定义一个类,名为scheduleList。代码如下: /** *scheduleList.cs * *Ver 变更日期 作者 *V1.0 2022-03-28 12:33:21 * *VX:lwdred QQ:463183376 */ using System; namespace Model.schedule { /// /// /// //[Serializable] [EntityHelper.Model.Property("scheduleList")] public class scheduleList { private long _id=0; /// /// ID /// [EntityHelper.Model.Property(EntityHelper.Model.ColumnKeyType.Identity)] public long id { set{ _id=value;} get{return _id;} } private string _title=string.Empty; /// /// 标题 /// public string title { set{ _title=value;} get{return _title;} } private DateTime _createtime=DateTime.Now; /// /// 创建时间 /// public DateTime createTime { set{ _createtime=value;} get{return _createtime;} } } }
类scheduleList,有三个字段ID、title、和createTime,分别含义是主键ID,标题和创建时间。为简单起见,本ORM并没有作别名设计,所以注意三个字段名与数据库表中的字段需一摸一样。
其中以下语句是用来标记该字段ID作为主键。 [EntityHelper.Model.Property(EntityHelper.Model.ColumnKeyType.Identity)]
以下语句用来标记当前类对应的数据表名是:scheduleList。 [EntityHelper.Model.Property("scheduleList")]
五、通过反射从类信息中获得字段名称和数据表名称 //定义实体 scheduleList schedule = new scheduleList(); schedule.id= 1; schedule.title = "标题"; schedule.createTime = DateTime.Now;
使用C#中的反射(System.Reflection),从实体中获得字段列表,将字段一一填充至SQL语句中,SQL语句就组装好了。
//通过反射获得实体字段 Type type = typeof(scheduleList); PropertyInfo[] pis = type.GetProperties(); foreach (PropertyInfo pi in pis) { Console.WriteLine(pi.Name); }
通过反射获得数据表的表名 PropertyAttribute property = (PropertyAttribute)(type.GetCustomAttributes(typeof(PropertyAttribute), false)[0]); Console.WriteLine(property.tableName);
新增操作的完整代码: #region 新增 /// /// 新增 /// /// 实体类型 /// 实体数据 /// 主键自增时:false、显式插入主键值:ture /// 连接字符串 /// public bool Insert(T model, bool isIncludeKeyColumn, string connString) where T : class { Type type = typeof(T); if (type == null) { return false; } PropertyInfo[] pis = type.GetProperties(); if (pis == null || pis.Length <= 0) { return false; } //获取表名 string tableName = GetTableName(type); if (string.IsNullOrEmpty(tableName)) { return false; } List columns = null; if (isIncludeKeyColumn == false) { //主键自增 columns = GetTableColumnsList(pis, ColumnKeyType.Identity | ColumnKeyType.Extend|ColumnKeyType.WidthoutAdd); } else { //显式插入主键值 columns = GetTableColumnsList(pis, ColumnKeyType.Extend | ColumnKeyType.WidthoutAdd); } if (columns == null || columns.Count <= 0) { return false; } //生成INSERT语句 StringBuilder sqlText = new StringBuilder(); sqlText.Append("INSERT INTO "); sqlText.Append(tableName); sqlText.Append(" ("); for (int i = 0; i < columns.Count; i++) { sqlText.Append(columns[i]); if (i < columns.Count - 1) { sqlText.Append(","); } } sqlText.Append(") VALUES ("); for (int i = 0; i < columns.Count; i++) { sqlText.AppendFormat("@{0}", columns[i]); if (i < columns.Count - 1) { sqlText.Append(","); } } sqlText.Append(");"); SqlParameter[] paras = new SqlParameter[columns.Count]; for (int i = 0; i < paras.Length; i++) { PropertyInfo propertyInfo = type.GetProperty(columns[i]); paras[i] = new SqlParameter(columns[i], GetMySqlDbType(propertyInfo.PropertyType), -1); paras[i].Value = propertyInfo.GetValue(model, null); } return SqlHelper.ExecuteNonQuery(connString, sqlText.ToString(), paras); } #endregion
其它操作不再一一列出。
我已将代码上传,下载码是: 4DACA2657F
下载码是啥?如何下载=》三味书屋-基于net6的简单ORM编码实现
总统是美国户口,人民不急才怪1959年新年第一天,卡斯特罗在古巴革命成功。美国人并不熟悉这位将古巴掉了个儿的年轻人。中情局来活儿了全面评估卡斯特罗。一顿研究,中情局铁口直断卡斯特罗并不是很亲共,他的政权几个月
2022年,美国古董商无偿捐赠二战相册给中国,收到意料之外的回礼2022年8月,美国明尼苏达州的一家典当行里来了一位特殊的客人,是一个身穿藏青色西装,拄着拐杖的白发老人,行动十分缓慢。老板埃文凯尔见状,赶忙上前搀扶,不料对方却突然来了一句快帮我
国内大储行业研究报告盈利能力边际改善,迎接新增装机大年(报告出品方作者国泰君安证券,庞钧文,周奥铮,石岩)1。投资分析我们认为清洁化与电气化是电力系统发展的长期趋势,发电侧可再生能源和用电侧电气设备的增加都会进一步加大电网的消纳压力,
终于,美国新毒王还是杀进来了!一hr一波未平,一波又起!一波未平,一波又起!BF7BA5毒株还在国内肆虐,XBB又杀过来了!今天下午,国务院联防联控机制召开新闻发布会宣布,从2022年的8月1日,一直到现在以来
无人机将怎样改变战争形态前不久,美国总统拜登签署了规范无人机运用的政策。眼下,世界各国与无人机相关的军事争夺正日趋激烈。从纳卡冲突俄乌冲突更可以看出,无人机投入实战运用所带来的显著效能。随着各国无人机及无
平定安史之乱的定海神针,大唐的中流砥柱郭子仪早年郭子仪是唐朝能安然度过安史之乱的肱骨之臣。如果没有他的高风亮节,安史之乱结束后的几次外乱可能直接让唐代宗成为亡国之君。安史之乱爆发时,郭子仪已经59岁了。尽管郭子仪活过了80,
唐朝退出西域后,谁是最后赢家?不是吐蕃,而是大唐一少数民族之华说史,史说自话。欢迎大家关注我,一起谈古论今,纵论天下大势。安史之乱爆发后,唐朝政府依以平叛的核心军队,是河陇朔方和西域诸镇调来的守塞兵将。天宝十四年十二月壬辰,唐政府制令中有
大唐盛视安远数字家电产业园开园迎客赋能赣粤门户,智造家电未来。3月8日,在江西省赣州市安远县,总投资20亿元占地140亩建筑面积达14万平方米的大唐盛视江西安远数字家电产业园正式开园。大唐盛视江西安远数字家电产业园
优质蛋白常见食物,补蛋白的好手,建议了解头条创作挑战赛蛋白质是生命基础,人每天都需要补充足量的蛋白质。营养学家给出了蛋白质含量最高的前五名。牛羊肉不在前五名内,快来看看都是哪些食物吧!一鸡蛋推荐做法生捞鸡蛋1鸡蛋洗干净,
蛋白质春天来了,适当的补充一下以多种草本植物为原料煲成的保健食物汤。黑豆15g,洗干净备用。红豆15g,洗干净备用。黄豆15g,洗干净备用。绿豆15g,洗干净备用。半边莲子15g,洗干净
溪木源公开独家痘敏肌疗愈机密!愈创木精华给你全周期祛痘护理体验油脂分泌旺盛嗑糖过多压力过大过度使用电子产品频繁化妆季节变化。对于痘敏肌,都能轻易成为爆痘诱因,而痘痘反复发作,也一直是长痘人在抗痘路上的最大阻碍。有没有一款抗痘产品,既能快速解决
魅族20系列官宣采用直屏设计,春天见1月22日,魅族官方发布魅族20系列海报,对此系列进行预热,海报中也稍微透露了一些关于手机的消息,从海报上来看,手机采用的是直屏设计。大年初一,愿大家兔年热爱无界,跃向新生。For
没必要花钱买新机!小米11重大更新,二手还剩一年保修都2022年了,不会还有人觉得,要玩那些什么和平精英王者荣耀这种游戏还需要买最新的旗舰机才能玩得痛快吧?不知道大家有没有发现,现在网上经常出现手机市场寒冬,消费者换机周期延长三年左
手机屏幕上方出现的各种图标有什么用,能关掉吗?看完涨知识了朋友们大家好,我是小俊,一个专注于知识分享的博主!那今天小俊来给大家分享一下我们手机上方各种图标的有关知识,我们在使用手机的时候啊,经常会发现在手机屏幕上面会出现很多图标,但是呢又
华为nova10对比vivoS16手机对比nova10对比S16华为nova10更快的充电速度更好的后置主摄镜头双扬声器Z轴线性马达金属边框更薄及更轻的机身vivoS16更强的处理器更快的储存规格更大的电池容量OI
世界第一高峰早已被成功登顶,5596米的玉龙雪山为何却无人登顶1920年12月20日英国登山队首次尝试登顶世界最高峰珠穆朗玛峰。此后英国登山队在1921年1922年1933年1936年1938年先后五次尝试从中国西藏的珠峰北坡进行登顶的行动均
这届春晚快被玩坏了娱兔迎春昨晚的春晚大家看了吗?主编硬着头皮看完了整场晚会,就一个感受春晚果然还是老样子,尬。几个小时的晚会汇集了满满的槽点,让我一时间不知道从何下手。虽然沈腾马丽的节目让大家大笑了
6岁上春晚的年画娃娃因春晚成名,8岁去世,他的悲剧谁买单01。hr1岁多接触戏曲,3岁开始学戏,4岁上节目夺冠,6岁登上春晚走红,8岁生命戛然而止这是童星邓鸣贺短短8年人生的关键词,让人不甚唏嘘。因为如果不是病痛的折磨,那个身着红肚兜,
你就是夜色中最闪亮的星游戏新春创作纪烟花璀璨,在升至空中最高点绽放那一刻,是如此的耀眼夺目。即使烟花易冷,可看烟花绽放时的那种雀跃的心情,却又那么美好,令人难忘。好的地方是你也没有开放放烟花,还好我们可
MiposhkaLarl带来一些预期之外的变化近日,Spirit选手Miposhka和他们的经理Korb3n对NAVI的换血和Larl加入Spirit后的队伍状态等发表了一些评价。(欧宝电竞资讯)关于NAVIMiposhka他
乐高IDEAS佳作赏析让游戏迷狂喜的时空传送枪今年乐高推出的地平线长颈兽,一经亮相就引起了众多游戏迷的关注,乐高也是熟练掌握了双厨狂喜的商业妙招。而弗莱德今天要给各位带来的乐高IDEAS社区投稿作品,则是出自游戏传送门2的时空
古天乐为何热衷于游戏代言?游戏新春创作纪古天乐是一代人心中的男神,尤其是还没有晒黑的白古时期。天地男儿里的程康,往那儿一站,满满的贵族气。后来的杨过,更是多少人的白月光,一见杨过误终身,可想而知他的容颜有多