• 简单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操作。
    示例代码:

    实体类

    [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
            );
        }
    }
    

    增删改

    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();
        }
    }
    

    配置信息

    <?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——映射

  • 相关阅读:
    android viewpager嵌套使用photoview异常问题
    android mvp设计模式
    android webview处理h5打开本地文件浏览器的功能
    使用python进行新浪微博粉丝爬虫
    android之ViewPager修改滑动速度
    我眼中的“阿里月饼事件”
    奄奄一息雏鸟
    RPC(远程过程调用)的应用
    对于开源菜谱的思考
    我跟360上网导航的过招
  • 原文地址:https://www.cnblogs.com/known/p/1510805.html
Copyright © 2020-2023  润新知