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

然后需要配置一下数据库连接,这里介绍的是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开源框架的学习的更多相关文章
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 下一篇:Farseer.net轻量级ORM开源 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级ORM开源框架 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...
- C++的ORM 开源框架
C++的ORM 开源框架 介绍一个C++的ORM工具ODB SOCI.LiteSQL.POCO数据库访问类库对比
- Farseer.net轻量级ORM开源框架 V1.x 教程目录
本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个 ...
随机推荐
- MergeSort(归并排序)算法Java实现
归并排序 归并排序 (merge sort) 是一类与插入排序.交换排序.选择排序不同的另一种排序方法.归并的含义是将两个或两个以上的有序表合并成一个新的有序表.归并排序有多路归并排序.两路归并排序 ...
- 十五、Java基础---------集合框架体系以及List
在介绍集合之前先说一下数组,正如我们所知,数组是某一类型数据的集合,强调的是数据,而且必须单一:集合框架的不同之处在于存储的数据类型没有任何限制,既可以存储基本数据类型(会自动提升为相应的包装类)也可 ...
- 自定义view
这两篇文章不可错过,是最靠谱的基础文献.总的来说,如果想完全定制,就继承与于View类:如果只是在原有控件基础上拓展,那就继承TextView.Button或者LinearLayout等.接下来,就以 ...
- ASP.NET MVC学习系列(一)-WebAPI初探
由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主 ...
- datagridview随窗体的大小而变,表格填满控件
在C#winform布局的时候,我们拖一个datagridview到窗体上面,将datagridview调整为适合窗体的大小,但是我们运行之后,点击最大化按钮的时候,却发现datagridview的大 ...
- Less 使用指南
简而言之 Less是为了简化css http://less.bootcss.com/features/ 以上链接是Less中文网站,里面有对Less的详细介绍. 一下写在使用中遇到的问题: 1.下载L ...
- Web Performance Test: 如果使用Plugin过滤Dependent Request
前言 由于Visual Studio的Web Performance Test是基于XML脚本的,留给用户修改测试行为的自由度并不高.因此,Plugin机制就对于实现很多客户化的配置显得很重要. 问题 ...
- c++链表归并排序的迭代版本
之前用js写了个归并排序非递归版,而这一次,c++封装链表的时候也遇到了一个归并排序的接口.邓老师实现了递归版本的归并排序,但是递归的调用函数栈的累积是很占内存空间的.于是乎,那试试在链表结构上实现以 ...
- R之data.table速查手册
R语言data.table速查手册 介绍 R中的data.table包提供了一个data.frame的高级版本,让你的程序做数据整型的运算速度大大的增加.data.table已经在金融,基因工程学等领 ...
- 解决Jenkins console输出乱码
背景 Jenkins console输出乱码,如 ������������� 1 解决办法 Jenkins Master 设置utf8 encoding Tomcat 启动脚本 export JAVA ...