简单ORM框架简介
Remark:
原题为《简单ORM框架设计》,本想以一个系列讲解框架的代码,而今已经提供链接下载源码,且苦于文笔错顿,于是就改一下介绍这个框架的使用。
开源项目:
http://dlite.codeplex.com/
https://github.com/known/DLite
源码下载链接:Known.DLite
简单ORM框架设计简介
Known.DLite是一个简单ORM框架,它是我的第一个开源项目,也是我的练习作品。虽然想法有些简单,思路有些混乱,代码不够严谨,性能不够优越,安全考虑不周,功能存在不全,但是比较满意的是它基本上完成了所需的功能,达到了我学习的目的,将我的思路实现了一遍。这个项目遗憾的是没有做单元测试。
在此将项目发布出来,一是大家共同学习,二是请大家拍砖扶正一些错误,三是交流一下。
首先有必要再此声明一下,这个作品只作学习之用,不作项目应用,因为目前成熟稳定的ORM框架已经比比皆是,而且这个作品也不成熟。
下面简单介绍一下这个框架的设计思路。思路,也就是贯穿整个框架程序的一条线路,正因为有它,整个程序代码才能够紧密的联系在一起。Known.DLite借鉴了DLinq的部分设计思想,主要是通过C#语言的“特性”将实体及其属性映射成数据库表的关系,自动组建CRUD操作命令语句,通过配置数据库提供者来执行操作。下图是项目的结构。
从上图中可以看出,Known.DLite、Known.DLite.Clients、Known.DLite.Mapping三个命名空间。
Known.DLite命名空间下是提供对象访问操作和提供者配置的一些类别。如命令类,命令参数类,提供者接口,提供者配置及配置单项,提供者异常,提供者工厂,查询(取了一个名字叫KQuery),事务操作。
Known.DLite.Clients命名空间下提供的是具体提供者实现类别,目前提供三种数据库的操作,分别是Access、SQL Server、Oracle。
Known.DLite.Mapping命名空间下是对对象映射的一些处理,如表特性,列特性,元数据类型(这是一个抽象类别,考虑映射还有XML映射方式,这里只实现了特性映射方式。),元数据参数,元数据管理,还有一个实体基类,这个类放在这个命名空间下有争议。我本不想写这个类的,但是为了简化实体类,将实体类重复的代码抽出来,所有才写了进来。写的时候不知道该放在那个命名空间下,想来想去,为了少using一个空间名,于是就放在这里。
Known.DLite大体上就是这个样子,其实里面还用到一些缓存技术,主要缓存元数据参数。另外可以实现实体继承操作,意思是一个实体类继承另一个实体,照样可以进行CRUD操作。
示例代码:
实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | [Table( "ks_User" )] public class UserInfo : BaseEntity<UserInfo> { [Column(IsDbGenerated = true , IsPrimaryKey = true )] public int ID { get ; set ; } [Column(IsChangeable = false )] public string UserName { get ; set ; } public string Password { get ; set ; } [Column(IsNullable = true )] public string Question { get ; set ; } [Column(IsNullable = true )] public string Answer { get ; set ; } public string Email { get ; set ; } public override string ToString() { return String.Format( "ID={0}<br />UserName={1}<br />Password={2}<br />Question={3}<br />Answer={4}<br />Email={5}<br />" , ID, UserName, Password, Question, Answer, Email ); } } |
增删改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | public partial class _Default : System.Web.UI.Page { protected void Page_Load( object sender, EventArgs e) { if (!String.IsNullOrEmpty(Request.QueryString[ "id" ])) { int id = int .Parse(Request.QueryString[ "id" ]); UserInfo user = UserInfo.Get(id); Response.Write(user.ToString()); Response.Write(user.ToJson()); } btnAdd.Click += new EventHandler(btnAdd_Click); btnUpdate.Click += new EventHandler(btnUpdate_Click); btnDelete.Click += new EventHandler(btnDelete_Click); BindData(); } void btnDelete_Click( object sender, EventArgs e) { int id = int .Parse(Request.Form[ "ID" ]); UserInfo user = UserInfo.Get(id); user.Delete(); user.Save(); BindData(); } void btnUpdate_Click( object sender, EventArgs e) { int id = int .Parse(Request.Form[ "ID" ]); UserInfo user = UserInfo.Get(id); user.Password = "555555" ; user.Update(); user.Save(); BindData(); } void btnAdd_Click( object sender, EventArgs e) { UserInfo user = new UserInfo { UserName = Request.Form[ "UserName" ], Password = Request.Form[ "Password" ], Question = Request.Form[ "Question" ], Answer = Request.Form[ "Answer" ], Email = Request.Form[ "Email" ] }; user.Insert(); user.Save(); BindData(); } private void BindData() { gvUser.DataSource = UserInfo.FindAll().OrderBy(u => u.ID); gvUser.DataBind(); } } |
配置信息
1 2 3 4 5 6 7 8 | <? xml version="1.0" encoding="utf-8" ?> < providers > < provider name="DefaultProvider"> < assembly >Known.DLite</ assembly > < clazz >Known.DLite.Clients.SqlProvider</ clazz > < connString >Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True</ connString > </ provider > </ providers > |
源码下载链接:Known.DLite
1.简单ORM框架设计1——实体
2.简单ORM框架设计2——实体操作
3.简单ORM框架设计3——实体提供者
4.简单ORM框架设计4——提供者配置及异常
5.简单ORM框架设计5——映射
Known 是基于 Blazor 轻量级、跨平台、低代码、易扩展的插件开发框架。
源码:https://gitee.com/known/Known
源码:https://github.com/known/Known
如果对您有帮助,点击⭐Star⭐关注 ,感谢支持开源!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战