V1.x版本終於到來了。本次版本的開發從3月份開始,花了一個月的時間完成了概念版本設計、開發。到了4月份進行屢次的內核的重構設計。到了5月份進行大規模的BUG修復、代碼優化。app
截止到今天(6月初),已知的BUG都已修復,並已在2個項目中應用了,而且運行良好。框架
一、新增隊列管理:ide
新版本改變了V0.x時的使用方式,以Entityframework爲模型進行參考設計。工具
在新版中,多了隊列的概念,也就是咱們在對錶進行操做時,並非單句運行的,常常是一段邏輯裏面會對不一樣的表進行屢次的操做。優化
最後在進行SaveChange()時,經過隊列管理(QueueManger)迭代全部隊列(Queue)進行委託執行提交到數據庫。編碼
這裏面涉及到了延遲執行的概念。 但一旦遇到「查詢」的SQL操做時,會提早提交代碼到數據庫。spa
二、新增數據庫操做:
1 Table.Data.User.Insert(new UserVO() { UserName = "yy" });
1 using (var context = new Table()) 2 { 3 var info = new UserVO() { UserName = "xx" }; 4 context.User.Insert(info); 5 context.SaveChanges(); 6 }
在舊版本中只提供了第一種方式,而在新版本中,多了第二種方式。
在第二種方式中,只有在context.SaveChanges();以後纔會對數據庫的操做生效。這是從調用的角度來講的,固然新版本中,內核處理方式徹底改變了。
採用new Table()方式,則會延遲到SaveChange()時才轉換成Sql,生成Sql參數化,而後提交到數據庫(默認事務方式,容許手動關閉),這裏相似EntityFramework的方式。
三、改變的實體類(再也不須要繼承基類了):
1 /// <summary> 2 /// 數據庫上下文 3 /// </summary> 4 public class Table : DbContext<Table> 5 { 6 /// <summary> 7 /// 加載表時觸發 8 /// </summary> 9 protected override void CreateModelInit(Dictionary<string, SetDataMap> map) 10 { 11 // 設置一張表的名稱、主鍵、外鍵 12 map["User"].SetName("Members_User"); 13 map["UserRole"].SetName("Members_Role"); 14 map["Orders"].SetName("Members_Orders"); 15 } 16 17 /// <summary> 18 /// 默認爲0時,可不顯示填寫這一項,當前只是爲了演示 19 /// </summary> 20 public Table() : base(0) 21 { 22 } 23 24 /// <summary> 普通表 </summary> 25 public TableSet<UserVO> User { get; set; } 26 27 /// <summary> 緩存表 </summary> 28 public TableSetCache<UserRoleVO> UserRole { get; set; } 29 30 /// <summary> 普通表(GUID主鍵) </summary> 31 public TableSet<OrdersVO> Orders { get; set; } 32 33 }
看了上面的實體類映射,是否是以爲很像EntityFramework的DbContext、DbSet呢。
UserVO 繼承 IEntity<int?> 並非必須的。繼承它後,框架會提供一些額外的擴展支持。(後面文章在詳細述說)
在新版本中,主鍵int ID不是強制性的繼承了。
PO、VO的分離。在舊版本中,若是有多張表的字段結構徹底同樣,則在映射時必需要爲每張表定義同樣的實體類。這對項目而言是臃腫的代碼。
在新版本中,VO脫離了框架的束縛,由Table來決定我這張表由「誰」來映射它的結構,這會給咱們的實現項目中帶來很是靈活的編碼方式,好比多個數據庫表對應同一個VO實體。
四、Map分離了:
在舊版本中,由於實體類只有一個,沒有分離。因此對整個class進行了映射並緩存。
而在新版本中,Map區分了:結構性的Map與非結構性的Map。
這樣區分的目地是由於結構性的Map是運行時固定不變的,能夠進行緩存。而非結構性的Map,包含了用戶定義(動態改變)的數據。因此不進行緩存處理。
它們在命名空間:FS.Sql.Map中
在這裏,你們有所瞭解就行。實際項目中用到不大,更多的是FS.Core中內部的調用。它標記了各個實體類的映射關係。
五、統一了緩存的管理:
在原來的版本中,有些緩存的(好比反射的、枚舉中文名稱的、ORM的)是存在各自的管理中。
而在新版本中,將統一放到FS.Cacher中。並提供了Clear()方法進行清除全部緩存。
六、結構的分離:
以上講的是調用方式的改變以及實體類映射的改變。爲了更方便於開源推廣,框架在結構上也進行了分離:
在實際項目中,你們可能不會用到除ORM之外的工具類(你們有自已經常使用的工具類)。所以分離出來,讓ORM更加專一。
所以本系列教程,只講解Farseer.Net相關代碼,其它工具類請你們自行下截後研究。(其實也沒什麼可研究性,就只是一些工具類方法)
兩個版本的區別是巨大的,做者在新版本中是進行了徹底的重寫,因此本篇中不能一一描述新舊版本的區別。本篇中僅是給你們帶來一個初步的印象,後面的篇幅,咱們會一一講解每一個運用。
七、全新的編碼方式:
最後,咱們在貼一段綜合調用的例子給你們:
1 using (var context = new Table()) 2 { 3 var info = context.User.Where(o => o.ID > 0 && o.CreateAt < DateTime.Now).Desc(o => new { o.ID, o.LoginCount }).Asc(o => o.GenderType).ToEntity(); 4 info.PassWord = "77777"; 5 context.User.Where(o => o.ID == 1).Update(info); 6 7 info.ID = null; 8 info.PassWord = "00000New"; 9 context.User.Insert(info); 10 11 12 context.User.Where(o => o.ID == 1).Append(o => o.LoginCount, 1).AddUp(); 13 context.User.AddUp(o => o.LoginCount, 1); 14 context.UserRole.ToList(); 15 context.UserRole.Where(o => o.ID == 1).ToList(); 16 context.UserRole.Where(o => o.ID > 1).ToList(); 17 var lst = context.User.Where(o => o.ID > 0).Desc(o => new { o.ID, o.LoginCount }).Asc(o => o.GenderType).ToList(); 18 19 context.SaveChanges(); 20 }
1 new Table().User.Where(o => o.ID > 0).ToList(); 2 Table.Data.User.AddUp(o => o.LoginCount, 1); 3 Table.Data.User.Where(o => o.ID > 0).ToList(); 4 Table.Data.Set<UserVO>().Where(o => o.ID > 0).ToList();
本篇不會講太多實質性的代碼,主要是講解下新舊版本的對比,讓你們有個直觀的印象。
本篇就講解到這,後面的篇幅將開始真正帶領你們認識新框架的魅力了。
QQ羣:116228666 (Farseer.net開源框架交流) 請註明:Farseer.Net
Farseer.Net是一款ORM框架 + 經常使用工具 + 擴展集合。
Farseer 寓意:先知、預言家 一般在某些場合時,提供計謀、策略。也但願該框架能給你們提供最大化的便捷。
ORM:其英文全稱是:Object(對象) Relational(關係) Mapping(映射)
Farseer.Net的目標是:快速上手、快速開發、簡單方便。
1 Table.Data.User.Where(o=>o.ID == 1).ToEntity(); 2 Table.Data.User.Where(o=>o.ID > 1).ToList(); 3 Table.Data.User.Where(o=>o.ID != 0).Delete(); 4 Table.Data.User.Where(o=>o.ID != 0).AddUp(o=>o.LoginCount, 1); 5 Table.Data.User.Where(o=>o.ID == 1).Update(new User{ UserName = "newName" }); 6 Table.Data.User.Insert(new User{ UserName = "newName" });