輕量級ORM框架QX_Frame.Bantina系列講解(開源)
一、框架簡介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html
二、框架使用方式介紹 http://www.cnblogs.com/qixiaoyizhan/p/7418058.html
三、框架性能對比 敬請期待
【前言】
上一節我們對Bantina ORM框架進行了簡單的說明介紹,在這一節中,我們將對Bantina框架的使用方式進行說明。
下面我們對Bantina 1.0 使用方式做詳細介紹。
介紹之前,我們先在本地創建一個數據庫,作為演示使用實例以及數據庫查詢對比的操作對象,該數據庫結構如下圖所示:
數據庫名:DB_QX_Frame_Test
其中包含三張表:TB_ClassName (班級名稱)
TB_People (人員表)
TB_Score (分數表)
表之間的關系是TB_People中有TB_ClassName的外鍵
【框架使用方式簡介】
我們通過Bantina1.0 ORM框架對測試表數據的增刪改查來實現對框架的使用介紹。
首先需要引用對應的dll類庫 QX_Frame.Helper,類庫多種獲取方式在每篇介紹的最下面獲取方式中有說明介紹。
Nuget方式獲取:打開Nuget包搜索器,搜索 QX_Frame.Helper,然后選擇版本2.0.0 安裝即可(1.0.0不包含Bantina框架)
項目中引用命名空間
using QX_Frame.Helper_DG.Bantina;
將上述表轉化成對應的實體,這里可以手動寫,也可以聯系本人獲取代碼生成器進行生成。(主外鍵關系要配置好,查詢時候需要)
1 public class DB_QX_Frame_Test : Bantina 2 { 3 public DB_QX_Frame_Test() : base("data source=.;initial catalog=DB_QX_Frame_Test;persist security info=True;user id=Sa;password=Sa123456;MultipleActiveResultSets=True;App=EntityFramework") { } 4 } 5 6 [Table(TableName = "TB_People")] 7 public class TB_People 8 { 9 [Key] 10 public Guid Uid { get; set; } 11 [Column] 12 public string Name { get; set; } 13 [Column] 14 public int Age { get; set; } 15 [Column] 16 [ForeignKey] 17 public int ClassId { get; set; } 18 [ForeignTable] 19 public TB_ClassName TB_ClassName { get; set; } 20 } 21 22 [Table(TableName = "TB_ClassName")] 23 public class TB_ClassName 24 { 25 // PK(identity) 26 [Key] 27 public Int32 ClassId { get; set; } 28 // 29 [Column] 30 public String ClassName { get; set; } 31 }
1、添加數據方法Add
實例化一個TB_People對象,然后對對象的屬性進行賦值。
實例化數據庫實體上下文,然后調用異步方法Add(),將實體添加進去。
判斷異步返回結果,如果添加成功,返回Success!
1 TB_People people = new TB_People (); 2 people.Uid = Guid.NewGuid(); 3 people.Name = "555"; 4 people.Age = 22; 5 people.ClassId = 3; 6 7 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test()) 8 { 9 if (test.Add(people).Result) 10 { 11 Console.WriteLine("insert success !"); 12 } 13 }
啟動調試執行該方法
原數據庫記錄:
執行后數據庫記錄:
很簡單的操作,我們將該條目插入了數據庫。
我們可以在數據庫上下文的對象的屬性中看到執行的sql語句
2、查詢單條實體QueryEntity
為什么我們不先講Update和Delete,因為我們的Update和Delete操作是先查詢確定要操作的對象后再執行對應的修改刪除方法,因此我們先講查詢操作。
查詢單條我們可以直接調用對應的查詢單條實體方法,並用Lambda方式傳入查詢條件進行查詢:
1 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test()) 2 { 3 TB_People people = test.QueryEntity<TB_People>(t => t.Name.Contains("55")); 4 Console.WriteLine($"uid = {people.Uid} , Name = {people.Name} , ClassName = {people.TB_ClassName.ClassName}"); 5 }
查詢一條Name包含55的數據,如果有多條,會自動匹配第一條。
執行上述代碼:
數據庫原紀錄:
執行結果:
通過主外鍵關聯的記錄也可以被查詢到。
我們可以在數據庫上下文的對象的屬性中看到執行的sql語句:
3、查詢多條記錄List->QueryEntities
查詢多條我們可以直接調用查詢多條的方法QueryEntites方法。該方法有多個重載,根據不同的業務需求進行不同的選擇。
1 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test()) 2 { 3 List<TB_People> peopleList = test.QueryEntities<TB_People>(); 4 foreach (var item in peopleList) 5 { 6 Console.WriteLine($"uid = {item.Uid} , Name = {item.Name} , ClassName = {item.TB_ClassName.ClassName}"); 7 } 8 }
我們執行上述的查詢方法:
數據庫原紀錄:
執行后的結果:
通過主外鍵關聯的記錄也可以被查詢到。
我們可以在數據庫上下文的對象的屬性中看到執行的sql語句:
4、分頁查詢List->QueryEntitiesPaging
分頁查詢和查詢全部記錄很相似,只要傳入分頁查詢的參數即可。
1 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test()) 2 { 3 List<TB_People> peopleList = test.QueryEntitiesPaging<TB_People, string>(1, 2, t => t.Name, t => t.Age == 3, out int count, true); 4 foreach (var item in peopleList) 5 { 6 Console.WriteLine($"uid = {item.Uid} , Name = {item.Name} , ClassName = {item.TB_ClassName.ClassName}"); 7 } 8 }
我們執行上述的查詢方法:
數據庫原紀錄:
查詢后的結果如下:
當前方法傳遞的參數說明:
QueryEntitiesPaging<TEntity, TKey>(int pageIndex, int pageSize, Expression<Func<TEntity, TKey>> orderBy, Expression<Func<TEntity, bool>> where, out int count, bool isDESC = false)
我們傳遞了一個pageIndex、pageSize、orderBy、where查詢條件,以及數據庫總數的一個out參數;
通過主外鍵關聯的記錄也可以被查詢到。
我們可以在數據庫上下文的對象的屬性中看到執行的sql語句:
SELECT TOP 2 * FROM (SELECT ROW_NUMBER() OVER (ORDER BY t.Name DESC ) AS RowNumber,* FROM TB_People t where (t.Age = 3)) AS TTTAAABBBLLLEEE WHERE RowNumber > (2 * (1 - 1))
5、修改操作Update
修改操作我們可以先查詢待操作的對象,然后對對象進行修改操作。也可以直接使用lambda表達式傳遞修改條件進行修改。
1 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test()) 2 { 3 TB_People people = test.QueryEntity<TB_People>(t => t.Name.Contains("55")); 4 Console.WriteLine($"uid = {people.Uid} , Name = {people.Name} , ClassName = {people.TB_ClassName.ClassName}"); 5 6 people.Age = 55; 7 if (test.Update(people).Result) 8 { 9 Console.WriteLine("update success !"); 10 } 11 }
我們將Name包含55的第一條記錄的年齡改成55.
我們執行上述的查詢方法:
數據庫原紀錄:
執行結果:
然后查看執行后的數據庫記錄:
可以看到,數據已經被成功修改。
通過數據庫上下文對象我們來查看執行的sql語句:
上述方法是默認根據主鍵進行修改,也就是說不支持主鍵的修改,如果想要得到主鍵修改的支持,請調用重載方法進行修改:
當然,如果是自增字段,那么會自動跳過修改環節。
6、刪除操作Delete
刪除操作我們可以先查詢待操作的對象,然后對對象進行刪除操作,也可以直接使用lambda表達式傳遞刪除條件進行刪除。
1 using (DB_QX_Frame_Test test = new DB_QX_Frame_Test()) 2 { 3 TB_People people = test.QueryEntity<TB_People>(t => t.Name.Contains("55")); 4 5 people.Age = 55; 6 7 if (test.Delete(people).Result) 8 { 9 Console.WriteLine("delete success !"); 10 } 11 }
我們將Name包含55的第一條記錄進行刪除操作.
我們執行上述的查詢方法:
數據庫原紀錄:
執行結果:
然后查看執行后的數據庫記錄:
可以看到,數據已經被成功刪除。
通過數據庫上下文對象我們來查看執行的sql語句:
上述方法是默認根據主鍵進行修改,如果我們想要快捷地進行對應條件的刪除,那么我們可以直接使用lambda表達式傳遞where條件進行修改,不需要先進行查詢操作。
7、原生Sql查詢方式支持
Bantina框架支持原生Sql語句的執行方式,有操作和查詢兩種方式,還保留了存儲過程執行接口。(使用泛型便於直接將結果轉化成對應的集合)
我們在這里簡單執行一條查詢集合的sql語句:
查詢結果:
在這里需要說明的是,這里不會直接對關聯外鍵表進行查詢,我們這里查詢傳入的泛型T和表查詢的結果必須是一一對應的,因此,我們可以實現配置DTO數據傳輸對象去匹配查詢的結果集。
並不是不能實現關聯查詢,是為了保持sql查詢的靈活性的特點沒有加相應功能。
到這里,我們大部分的基礎功能操作已經演示完畢,已經可以滿足我們大部分的業務需求。
關於我們Bantina ORM 實體框架的性能介紹我們會放在下一章進行和其他常用ORM框架作為對比展示。
【獲取方式】
1、Nuget獲取:Nuget搜索 QX_Frame.Helper_DG
2、GitHub查看源代碼:https://github.com/dong666/QX_Frame.Helper_DG
注:bantina已正式改名為Bankinate,新版本GitHub:https://github.com/dong666/QX_Frame.Bantina
3、聯系本人獲取,聯系方式在下方博客簽名中,qq、email均可。