前面幾章主要是概念性的東西為主,向初學者們介紹項目開始前的一些知識與內容,從本章開始將會進入實操階段,希望跟著本系統學習的朋友認真按說明做好每一步操作(對于代碼最好是直接照著文檔內容在你的IDE中打一次出來,而不是使用復制粘貼),這樣對你理解后面的章節會有較好的幫助,如果你對我這種書寫方式有什么建議或支持,也希望在評論中留言,謝謝你的支持。
SubSonic3.0簡介
SubSonic是Rob Conery用c#語言寫的一 個ORM開源框架,使用BSD軟件授權許可(The BSD 3-Clause License)。它是一個實用的快速開發框架,通過非常簡單的配置,以及附帶的T4模板,就可以幫我們生成功能強大的數據訪問層工具,讓開發人員遠離SQL語句的拼接,專注于業務邏輯的開發。
SubSonic3.0適合短、平、快的中小型項目開發,支持MsSql、MySQL與SQLite三種數據庫,支持Linq和支持事務。對數據庫操作靈活,對生成的SQL語句會自動進行優化,雖然是ORM框架,但在性能上并沒有太大的損失。它上手容易,是一個非常棒的ORM開發框架。
3.0版本最大的缺點是框架未開發完善,對多表關聯查詢支持的不是很好,只支持一個多表關聯條件(復雜的多表關聯只能使用存儲過程或SQL語句拼接方式來實現);條件語句對In與Not In不支持(需要在數據層重新封裝處理才行);如果使用Redis緩存的話,存儲數據時對subsonic3.0生成的實體有兼容問題,需要做一次轉換封裝后才能使用。
不過總的來說,這些缺點都是可以克服的,在開發效率、二次開發、軟件維護上來說,優點也是非常明顯的,請大家耐心學完本系列,你就能很容易的掌握SubSonic3.0這個開發利器。
SubSonic3.0安裝說明
SubSonic3.0安裝練習相關附件下載
在MsSql中新建一個數據庫SubSonicTest,并設置好登陸帳號與密碼為SubSonicTest。
運行下載包里的“SQL語句.txt”文件里的語句,生成數據表、記錄與測試用的存儲過程。
創建一個空白解決方案
在解決方案中創建一個空Web應用程序項目
將SubSonic文件夾復制進項目文件夾中
刷新項目就可以看到隱藏的SubSonic文件夾
打開Web.config,添加數據庫鏈接字串
<connectionStrings> <!-- 連接數據庫的字符串 --> <add name="View Code將Dll和SubSonic.Core復制到解決方案中
添加SubSonic3.0項目(直接使用源碼項目,方便在使用時調試及修改)
添加SubSonic.Core項目和Castle.Core.dll引用(大神TerryLee的博客里有Castle 開發系列文章 有興趣的朋友可以進去學習一下)
將SubSonic包含進項目中
如果你的數據庫名稱、帳號和密碼設置同面前要求一樣的話,T4模板將會直接運行生成相關實體類,如果設置不一樣的,請按下面要求來進行設置
打開Settings.ttinclude配置文件
設置好以后,選擇全部T4模板文件,運行生成代碼
SubSonic3.0模板介紹說明
本文只介紹附件中SubSonic文件夾模板(MsSql),不適用官方發布的模板
文件名稱 | 說明 |
ActiveRecord.tt | 按數據表生成對應名稱的類實體(Model),以及支持lambda表達式的各種常用函數(包括增、改、查、刪、Exists等) |
Context.tt | 生成常用公共模版函數:Select、Insert、Avg、Count、Max、Min、Variance、StandardDeviation、Sum、Delete、GetQuery、Update等 |
CreateModel.tt | 新增模板(原SubSonic3.0沒有這個模板),主要功能是數據表生成對應名稱的類實體(Model),這是普通的類實體,不附任何多余的內容(函數),主要用于存儲到Redis緩存或做C/S接口通訊時轉Json使用。非必須項 |
EntityTable.tt | 新增模板(原SubSonic3.0沒有這個模板,里面的功能從Structs.tt模板中分離出來的),主要功能是可直接獲取數據表名稱與字段名稱,減少開發中硬編碼的存在 |
Settings.ttinclude | 模版參數配置 |
SQLServer.ttinclude | MsSql數據庫讀取、生成的相關配置 |
StoredProcedures.tt | 生成存儲過程調用函數(本模板生成的函數調用存儲過程非常方便,詳情請關注例子) |
Structs.tt | 生成表結構模版,提供給SubSonic插件調用 |
SubSonic3.0使用例子
點擊下載本文本例子的解決方案源碼
之前發布過《SubSonic3.0使用例子》,當時剛開始接觸寫得有點亂,現在重新整理一下,使用上面生成的類來進行操作,可以在項目中直接運行。對于下面的例子,可以直接在解決方案中Debug運行,查看運行結果,以加深理解,當然大部分功能在正式開發中很少使用,所以簡單了解一下就可以了,只要會用Lambda,那么后面相關章節介紹時你就會使用。
下面例子只適用于本文所附帶的模板,特此說明
using System;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text;using Solution.Dataaccess.DataModel;using SubSonic.Linq.Structure;using SubSonic.Query;namespace SubSonicTest{ public partial class Test : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //------------------------------------------------------------------------------- // 新增記錄 //------------------------------------------------------------------------------- var branch = new Branch(); branch.DeptCode = SPs.P_Branch_GetMaxBranchCode(2, 1).ExecuteScalar() + ""; branch.Name = "客服部"; branch.Comment = "客戶售后服務維護部門"; branch.ParentId = 1; branch.Sort = 7; branch.Depth = 2; //AddDate這個屬性不用賦值,ORM框架生成更新語句時會自動過濾該字段,更新時將會使用數據庫中設置的默認值 //branch.AddDate = DateTime.Now; //保存進數據庫 branch.Save(); WriteLine("記錄添加成功,新增Id為:" + branch.Id); //------------------------------------------------------------------------------- // 修改記錄 //------------------------------------------------------------------------------- //從數據庫中讀出剛添加的記錄 var branchModel = Branch.SingleOrDefault(x => x.Id == branch.Id); //也可以用這個 //var branchModel = new Branch(x => x.Id == branch.Id); //打印讀取出來的數據 WriteLine(branchModel.ToString()); //修改名稱為“售后服務部” branchModel.Name = "售后服務部"; //保存進數據庫 branchModel.Save(); //重新從數據庫中讀取出來并打印到輸出窗口 WriteLine((new Branch(x => x.Id == branch.Id)).ToString()); //------------------------------------------------------------------------------- // 判斷剛剛修改的記錄是否存在 //------------------------------------------------------------------------------- if (Branch.Exists(x => x.Id == branch.Id)) { WriteLine("Id為" + branch.Id + "的記錄存在!"); } else { WriteLine("Id為" + branch.Id + "的記錄不存在!"); } //------------------------------------------------------------------------------- // 刪除記錄 //------------------------------------------------------------------------------- //刪除當前記錄 Branch.Delete(x => x.Id == branch.Id); //也可以使用這種方法刪除 //branchModel.Delete(); Wri
新聞熱點
疑難解答