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 整个 ...
随机推荐
- jacob 多个web项目报错 jacob-1.14.3-x64.dll already loaded in another classloader jacob
多个web项目报错 jacob-1.14.3-x64.dll already loaded in another classloader jacob 这个问题困扰了很久,网上很多解决方案,很多都不成功 ...
- 三层架构下的EntityFramework codefirst
好久没写博客了,今天研究了EF框架的CodeFirst模式,从字面意思可以看出,代码优先.所谓代码优先,与以往的添加ado.net不同,主要是编写代码生成数据库和数据表,生成数据实体映射.个人感觉这种 ...
- 转:SVN服务器搭建和使用(三)
http://www.cnblogs.com/xiaobaihome/archive/2012/03/20/2407610.html 接下来,试试用TortoiseSVN修改文件,添加文件,删除文件, ...
- .NET 使用CouchBase 基础篇
2011年2月,CouchOne和memebase合并后,改名为Couchbase,官网地址(www.couchbase.com).membase最后一个版本为1.7.2,可在Couchbase的官网 ...
- Microsoft Office Excel 不能访问文件及COM无法访问
Microsoft Office Excel 不能访问文件及COM无法访问 Microsoft Office Excel 不能访问文件“*.xls”. 可能的原因有: 1 文件名称或路径不存在. 2 ...
- tomcat,Jboss,weblogic区别与比较
一.tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,它是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心 ...
- php,js清除cookie
目的通过控制cookie中的是否有莫个值实现是否跳转重定向 http方式 <?php if ($_COOKIE['test'] == 1) { echo 'have cookie test'; ...
- jquery中没有innerHTML
本人正在学习使用jQuery. 发现如果我在div或者其他非表单的标签中赋值,原本用普通的js就直接document.getElementById("id").innerHtml( ...
- ASP值view State
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 任意阶幻方(魔方矩阵)C语言实现
魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...