首页 > 代码库 > SunSonic 3.0 ORM开源框架的学习

SunSonic 3.0 ORM开源框架的学习

SubSonic 3.0简介

接触到SubSonic3.0 ORM框架是看了AllEmpty大神的从零开始编写自己的C#框架(链接在此)系列的随笔接触到的,本文章学习内容源于AllEmpty大神。

SubSonic就是一个ORM开源框架。作者是Robe Conery,用C#语言写的。其中包含了T4模板可以快速生成数据层实体类,这是一个实用的快速开发框架。让开发人员原理SQL语句的拼接,专注于业务逻辑的实现。SubSonic 3.0支持MsSql、MySql与SQLite三种数据库,对数据库操作灵活,对生成的SQL语句会自动进行优化,虽然是ORM框架,但在性能上并没有太大的损失。它上手容易,是一个非常棒的ORM开发框架。

我使用过程中的切身体会是:一次编写,终身使用。将自己需要的功能写在T4模板,利用T4模板强大的自定义功能可以迅速而准确地生成自己的实体类。可以Select类、实体类查询,支持LINQ,支持聚合函数,支持存储过程,可以使用Distinct关键字。(部分功能AllEmpty添加,我使用的是他的修改版)。

SubSonic 3.0配置

创建项目(整个解决方案下载链接在本文后面)并将SubSonic.Core和Castle.dll引用后,添加SubSonic文件夹。此时,整个项目的文件结构如下所示:

image

然后需要配置一下数据库连接,这里介绍的是MSSQLSERVER。打开SubSonicTest项目中SubSonic文件夹中的Setting.ttinclude,该文件位置如下图红框所示:

image

打开该文件在开始找到如下所示的内容:

image

上图红色箭头指向的数据库连接字符串对应Web.config配置文件中的ConnectionStrings的名称,数据名称对应与ConnectString中的数据库。ConnectionStrings配置方式(以我的为例)如下图红框内容所示:

image

上图中的数据库连接字符串名称一定要和Web.config配置文件中的保持一致,否则会出现错误。确保没有问题后,按如下所示使用T4模板生成数据库实体类:

image

生成的实体类如下所示:

image

SubSonic 3.0简单实用

在SubSonicTest项目中新建一个Aspx窗体文件,这里名称是Test.aspx。对应的cs后台文件代码如下所示:

using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text;using SubSonic.Linq.Structure;using SubSonic.Query;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using Solution.DataAccess.DataModel;namespace SubSonicTest{    public partial class Test : System.Web.UI.Page    {        protected void Page_Load(object sender, EventArgs e)        {                       //新增记录            var branch1 = new Branch            {                DeptCode = SPs.P_Branch_GetMaxBranchDeptCode(2, 1).ExecuteScalar() + "",                Name = "网络部",                Comment = "网络问题解决中心",                ParentId = 1,                Sort = 8,                Depth = 2            };                        //保存至数据库            branch1.Save();            //打印出来S            PrintImpInfo("记录添加成功,新增Id="+branch1.Id);            //查询刚刚添加的记录并修改            var branchModel = Branch.SingleOrDefault(x => x.Comment == "网络问题解决中心");            branchModel.Name = "售后服务部";            branchModel.Save();                        //删除刚才添加的记录            Branch.Delete(x => x.Comment == "网络问题解决中心");            if (Branch.Exists(x => x.Comment == "网络问题解决中心"))            {                PrintImpInfo("存在");            }            else            {                PrintImpInfo("不存在");            }                        //查询Branch下所有的数据            var list = Branch.All();            foreach (var branch in list)            {                PrintImpInfo(string.Format("名字={0},评论={1},添加日期={2}", branch.Name, branch.Comment, branch.AddDate.ToString("yyyy-MM-dd HH:mm:ss")));            }                         // //使用类实体附带的函数查询            PrintImpInfo("使用类实体附带的函数查询");            var braanchList = Branch.Find(x => x.Id > 0);            foreach (var branch in braanchList)            {                PrintImpInfo(branch.Id.ToString());                PrintImpInfo(branch.Name);                PrintImpInfo(branch.AddDate.ToString("yyyy-MM-dd HH:mm:ss"));            }            PrintImpInfo("------------------------");            //分页功能,获取第2页记录(每页5条记录)            PrintImpInfo("获取第2页记录(每页5条记录");            var il = Branch.GetPaged("Id Desc", 2, 4);            foreach (var branch in il)            {                PrintImpInfo(branch.Id.ToString());                PrintImpInfo(branch.Name);                PrintImpInfo(branch.Sort.ToString());                PrintImpInfo(branch.Depth.ToString());                PrintImpInfo(branch.ParentId.ToString());                PrintImpInfo(branch.AddDate.ToString("yyyy-MM-dd HH:mm:ss"));            }            PrintImpInfo("------------------------");            //使用数据库名+DB可以直接调用聚合函数            PrintImpInfo("数据库名+DB可以直接调用聚合函数");            var db = new SubSonicTestDB();            //平均值            PrintImpInfo("平均值"+db.Avg<Position>(x=>x.Id).Where<Position>(x=>x.Id<12).ExecuteScalar()+" ");            //计算数量            PrintImpInfo("计算数量" + db.Count<Position>(x => x.Id).ExecuteScalar() + " ");            //计算合计量            PrintImpInfo("计算合计量" + db.Sum<Position>(x => x.Id).ExecuteScalar() + " ");            //最大值            PrintImpInfo("最大值" + db.Max<Position>(x => x.Id).ExecuteScalar() + " ");            //最小值            PrintImpInfo("最小值" + db.Min<Position>(x => x.Id).ExecuteScalar() + " ");            //存储过程调用方法            var obj = SPs.P_Branch_GetMaxBranchDeptCode(1,0).ExecuteScalar();            PrintImpInfo("存储过程调用obj="+obj);            //Linq查询方式            PrintImpInfo("Linq查询方式");            var query = new Query<Branch>(db.provider);            var posts = from p in query                where p.DeptCode.StartsWith("0101")                select p;            foreach (var branch in posts)            {                PrintImpInfo(branch.ToString());            }            query = db.GetQuery<Branch>();            posts = from p in query                where p.Id > 3 && p.Id < 6                select p;            foreach (var branch in posts)            {                PrintImpInfo(branch.ToString());            }            var newBranchList = query.ToList<Branch>();            foreach (var branch in newBranchList)            {                PrintImpInfo(branch.ToString());            }            //Linq多表关联查询方式            PrintImpInfo("Linq多表关联查询方式");            var query1 = from b in Position.All()                join p in Branch.All() on b.Branch_Id equals p.Id                where p.DeptCode == "0101"                select p;            foreach (var branch in query1)            {                PrintImpInfo(branch.ToString());            }                    }        /// <summary>        /// 在Debug模式下打印信息到输出窗口中        /// </summary>        /// <param name="info"></param>        private void PrintImpInfo(string info)        {            System.Diagnostics.Debug.WriteLine(info);        }           }}

加入断点调试(要求Debug下),即可输出打印出的内容,如下所示(打开输出窗口的快捷键是Ctrl+Alt+O):

image

感谢AllEmpty大神让我认识到了SubSonic这个ORM框架,么么哒。

整个解决方案在下面:

点此下载