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文件夹。此时,整个项目的文件结构如下所示:

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

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

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

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

生成的实体类如下所示:

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(, ).ExecuteScalar() + "",
                Name = "网络部",
                Comment = "网络问题解决中心",
                ParentId = ,
                Sort = ,
                Depth =
            };

            //保存至数据库
            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("使用类实体附带的函数查询");
            );
            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条记录");
            , );
            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().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() + " ");

            //存储过程调用方法
            ,).ExecuteScalar();
            PrintImpInfo("存储过程调用obj="+obj);

            //Linq查询方式
            PrintImpInfo("Linq查询方式");
            var query = new Query<Branch>(db.provider);
            var posts = from p in query
                ")
                select p;
            foreach (var branch in posts)
            {
                PrintImpInfo(branch.ToString());
            }

            query = db.GetQuery<Branch>();
            posts = from p in query
                 && p.Id <
                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
                "
                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):

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

整个解决方案在下面:

点此下载

SunSonic 3.0 ORM开源框架的学习的更多相关文章

  1. Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 下一篇:Farseer.net轻量级ORM开源 ...

  2. Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM ...

  3. Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框 ...

  4. Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源 ...

  5. Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...

  6. Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级ORM开源框架 ...

  7. Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...

  8. C++的ORM 开源框架

    C++的ORM 开源框架 介绍一个C++的ORM工具ODB SOCI.LiteSQL.POCO数据库访问类库对比

  9. Farseer.net轻量级ORM开源框架 V1.x 教程目录

    本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个 ...

随机推荐

  1. Yii2.0中文开发向导——Where条件查询全解析

    在Yii的Model里进行查询的时候 where是必不可少的.Where方法声明为 static where( $condition ) 其中参数 $condition类型为字符串或者数组 1.字符串 ...

  2. 记录对依赖注入的小小理解和autofac的简单封装

    首先,我不是一个开发者,只是业余学习者.其次我的文化水平很低,写这个主要是记录一下当前对于这块的理解,因为对于一个低水平 的业余学习者来说,忘记是很平常的事,因为接触.应用的少,现在理解,可能过段时间 ...

  3. @synthesize vs. @dynamic

    @synthesize will generate getter and setter methods and corresponding instance variable for your pro ...

  4. Orcale与jfinal的添加时间问题

    时间只能不能使用一般的方法进行添加,必须转换,比如添加当前时间,如上图所示

  5. [转]NPOI 单元格级别应用

    原文地址:http://hi.baidu.com/linrao/item/fadf96dce8770753d63aaef2 HSSFWorkbook hssfworkbook = new HSSFWo ...

  6. 原来MySQl就是这样工作的!

    一.MySQL简单介绍     MySQL是当今最流行的开源数据库管理系统,超过10亿的下载量足可以证明这点.MySQL以其速度.高可靠性.简单易用,广泛应用,一些大型企业也在逐渐应用,如:Faceb ...

  7. JS常规的验证代码 - 手机号,邮箱,字符串查找

    //在字符串中执行查找 function isDisgit(s){ var reg = /^[0-9]{1,20}$/; var result = reg.exec(s); //如果格式不正确,返回n ...

  8. php : 类常量

    使用总结: 1.不能使用 define 来定义 2.通过 "类名::常量名" 来获取 /** * PHP类常量 * * 类常量属于类自身,不属于对象实例,不能通过对象实例访问 * ...

  9. WebClient上传音频文件

    //WebClient上传音频文件 public string UploadVoice(string fileNamePath) { Voice model=new Voice(); string s ...

  10. POSTGRESQL 数据库导入导出

    导入整个数据库 psql -U postgres(用户名)  数据库名(缺省时同用户名) < /data/dum.sql   导出整个数据库 pg_dump -h localhost -U po ...