上文講述了數據庫配置使用,搭建好數據庫的連接方式了咱們知道怎麼作了。框架
事實上,至今咱們仍然尚未講到代碼方面,花了前面這麼多篇幅講解,主要是想由淺入深,否則一上來給你們講解這講解那的,聽的也一頭霧水,反而得不到效果。ide
這篇比較重要,由於它是咱們在使用Farseer.Net時最基礎的類:DbContext(與EntityFramework的DbContext一個概念)函數
從字面上,咱們就知道:它是咱們程序(業務)與數據庫之間的溝通橋樑,在對錶(實體類)進行CURD時,須要讓實體類知道,我須要訪問哪一種數據庫。工具
而數據庫上下文,就是告訴咱們的實體類,應該對哪一個數據庫類型進行鏈接訪問。spa
在Farsser.Net裏,數據庫上下文對應的類即是:DbContext,這即是須要咱們繼承它,而後在這個類裏面,封裝咱們須要的實體類的屬性。.net
/// <summary> /// 經過數據庫配置,鏈接數據庫 /// </summary> /// <param name="dbIndex">數據庫選項</param> protected DbContext(int dbIndex = 0) /// <summary> /// 經過自定義數據連接符,鏈接數據庫 /// </summary> /// <param name="connectionString">數據庫鏈接字符串</param> /// <param name="dbType">數據庫類型</param> /// <param name="commandTimeout">SQL執行超時時間</param> protected DbContext(string connectionString, DataBaseType dbType = DataBaseType.SqlServer, int commandTimeout = 30)
帶int dbIndex形參的構造函數,傳入的即是DbConfig的配置索引項(假如咱們配置了多個數據庫的話)。code
形參int dbIndex = 0 的默認設置,咱們不須要額外的代碼來設置它,除非你須要不一樣的數據庫的配置。或者根據本身的業務須要經過自定義構造來達到運行時不一樣的數據庫訪問。
最後一個構造函數,是在咱們不使用DbConfig數據庫配置項的狀況下,指定鏈接方式。
上面咱們沒有用到Web.Config(或者App.Config)配置項,事實上博主很不喜歡在Web.Config中進行設置自定義的配置項,感受這會有「侵略」的感受。
DbContext<TPo>,事實上這個類僅是多了一個屬性:
/// <summary> /// 靜態實例 /// </summary> public static TPo Data { get { return new TPo { IsMergeCommand = false }; } }
它僅僅是讓咱們不須要實例化using(var db = new DbContext())來調用。
不少時候,咱們僅僅是一個很簡單的操做。好比僅一條數據的插入:
// 插入數據 Table.Data.User.Insert(new UserVO() { UserName = "yy" });
而不須要:
using (var context = new Table()) { info = new UserVO() { UserName = "xx" }; // 插入數據 context.User.Insert(info, true); context.SaveChanges(); }
它繼承自DbContext<TPo>的:
1 /// <summary> 2 /// 數據庫上下文 3 /// </summary> 4 public class Table : DbContext<Table> 5 { 6 /// <summary> 7 /// 默認爲0時,可不顯示填寫這一項,當前只是爲了演示 8 /// </summary> 9 public Table() : base(0) { } 10 11 [Set(Name = "Members_User")] 12 public TableSet<UserVO> User { get; set; } 13 14 [Set(Name = "Members_Role")] 15 public TableSetCache<UserRoleVO> UserRole { get; set; } 16 [Set(Name = "Members_Orders")] 17 public TableSet<OrdersVO> Orders { get; set; } 18 19 [Set(Name = "Members_Orders")] 20 [SortDelete(Name = "IsDeleteByAt", FieldType = eumSortDeleteType.DateTime, Value = true)] 21 public TableSet<OrdersVO> OrdersAt { get; set; } 22 23 [Set(Name = "Members_Orders")] 24 [SortDelete(Name = "IsDeleteByBool", FieldType = eumSortDeleteType.Bool, Value = true)] 25 public TableSet<OrdersVO> OrdersBool { get; set; } 26 27 [Set(Name = "Members_Orders")] 28 [SortDelete(Name = "IsDeleteByNum", FieldType = eumSortDeleteType.Number, Value = 3)] 29 public TableSet<OrdersVO> OrdersNum { get; set; } 30 }
TableSet至關於EntityFramework的Set類,這在下一篇中才講述。
/// <summary> /// 數據庫提供者(不一樣數據庫的特性) /// </summary> public AbsDbProvider DbProvider { get; private set; } /// <summary> /// 數據庫操做 /// </summary> public DbExecutor DataBase { get; private set; } /// <summary> /// 執行數據庫操做 /// </summary> public ExecuteSql Executeor { get; private set; } /// <summary> /// 映射關係 /// </summary> public ContextMap Map { get; private set; }
DbProvider:數據庫提供者,不一樣的數據庫類型都要有對應的實現類,好比有:SqlServerProvider。裏面實現不一樣數據庫的一些特性。
DataBase:是生成SQL以後最終提交到這裏進行數據庫交互。
Executeor:經過DataBase執行後返回的object/datatable類型進行泛型轉換。它與DataBase的區別是它更區向業務上的數據類型。
Map:是指數據庫上下文的映射信息,包括一些Property的信息。
/// <summary> /// 保存修改 /// IsMergeCommand=true時:只提交一次SQL到數據庫 /// </summary> /// <param name="isOlation">默認啓用事務操做</param> public int SaveChanges(bool isOlation = true)
根據方法命名,咱們就能夠聯想到它是針對數據進行變動時進行的保存提交。
注意的是:對數據庫的查詢是不須要調用這個方法的,僅在對數據進行更新、刪除、插入時,才須要調用。
可是,若是你是使用靜態方式,即不須要new DbContext()方式時,也不須要調用SaveChanges的。這是提供的一種便利(語法糖)。
其帶了個參數bool isOlation = true,爲true時,會默認以事務的方式提交。若是您不但願這樣,能夠顯示傳入false。
一般在對數據庫進行屢次(一個邏輯裏面)數據更新、插入時操做。固然這種方式保存的時候默認是開啓事務的(查詢不是),您也能夠手動調用重截來不開啓它:SaveChange(false);
值得注意的是:僅僅是對數據庫的查詢操做時,是不支持延遲執行的。換句話說,不須要調用context.SaveChange()方法。
但若是須要對數據進行更新、插入時,則必須調用。
可是若是用上文提供的靜態方法,無論作何操做,也不須要調用SaveChange()。
我在從新說明下SaveChange()方法在何時使用:
這一篇,你們學會了數據庫上下文的代碼編寫了,雖然篇幅很長,但其實就是那麼一回事,簡單的不能再簡單了。
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" });