1、框架簡介 http://www.cnblogs.com/qixiaoyizhan/p/7417467.html
html
2、框架使用方式介紹 http://www.cnblogs.com/qixiaoyizhan/p/7418058.html git
3、框架性能對比 敬請期待github
上一節咱們對Bantina ORM框架進行了簡單的說明介紹,在這一節中,咱們將對Bantina框架的使用方式進行說明。sql
下面咱們對Bantina 1.0 使用方式作詳細介紹。數據庫
介紹以前,咱們先在本地建立一個數據庫,做爲演示使用實例以及數據庫查詢對比的操做對象,該數據庫結構以下圖所示:框架
數據庫名:DB_QX_Frame_Test異步
其中包含三張表:TB_ClassName (班級名稱)ide
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 }
實例化一個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語句
爲何咱們不先講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語句:
查詢多條咱們能夠直接調用查詢多條的方法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語句:
分頁查詢和查詢所有記錄很類似,只要傳入分頁查詢的參數便可。
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))
修改操做咱們能夠先查詢待操做的對象,而後對對象進行修改操做。也能夠直接使用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語句:
上述方法是默認根據主鍵進行修改,也就是說不支持主鍵的修改,若是想要獲得主鍵修改的支持,請調用重載方法進行修改:
固然,若是是自增字段,那麼會自動跳過修改環節。
刪除操做咱們能夠先查詢待操做的對象,而後對對象進行刪除操做,也能夠直接使用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條件進行修改,不須要先進行查詢操做。
Bantina框架支持原生Sql語句的執行方式,有操做和查詢兩種方式,還保留了存儲過程執行接口。(使用泛型便於直接將結果轉化成對應的集合)
咱們在這裏簡單執行一條查詢集合的sql語句:
查詢結果:
在這裏須要說明的是,這裏不會直接對關聯外鍵表進行查詢,咱們這裏查詢傳入的泛型T和表查詢的結果必須是一一對應的,所以,咱們能夠實現配置DTO數據傳輸對象去匹配查詢的結果集。
並非不能實現關聯查詢,是爲了保持sql查詢的靈活性的特色沒有加相應功能。
到這裏,咱們大部分的基礎功能操做已經演示完畢,已經能夠知足咱們大部分的業務需求。
關於咱們Bantina ORM 實體框架的性能介紹咱們會放在下一章進行和其餘經常使用ORM框架做爲對比展現。
一、Nuget獲取:Nuget搜索 QX_Frame.Helper_DG
二、GitHub查看源代碼:https://github.com/dong666/QX_Frame.Helper_DG
注:bantina已正式更名爲Bankinate,新版本GitHub:https://github.com/dong666/QX_Frame.Bantina
三、聯繫本人獲取,聯繫方式在下方博客簽名中,qq、email都可。