上文講述了數據庫配置使用,搭建好數據庫的鏈接方式了我們知道怎么做了。
事實上,至今我們仍然還沒有講到代碼方面,花了前面這么多篇幅講解,主要是想由淺入深,不然一上來給大家講解這講解那的,聽的也一頭霧水,反而得不到效果。
這篇比較重要,因為它是我們在使用Farseer.Net時最基礎的類:DbContext(與EntityFramework的DbContext一個概念)
從字面上,我們就知道:它是我們程序(業務)與數據庫之間的溝通橋梁,在對表(實體類)進行CURD時,需要讓實體類知道,我需要訪問哪種數據庫。
而數據庫上下文,就是告訴我們的實體類,應該對哪個數據庫類型進行連接訪問。
在Farsser.Net里,數據庫上下文對應的類便是:DbContext,這便是需要我們繼承它,然后在這個類里面,封裝我們需要的實體類的屬性。
/// <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的配置索引項(假如我們配置了多個數據庫的話)。
形參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()方法在什么時候使用:
- new實例化方式
- 需要數據進行更新(Update)、插入(Insert)
這一篇,大家學會了數據庫上下文的代碼編寫了,雖然篇幅很長,但其實就是那么一回事,簡單的不能再簡單了。
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" });