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(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):

感謝AllEmpty大神讓我認識到了SubSonic這個ORM框架,么么噠。
整個解決方案在下面:
點此下載
新聞熱點
疑難解答