上文讲述了数据库配置使用,搭建好数据库的连接方式了咱们知道怎么作了。框架
事实上,至今咱们仍然尚未讲到代码方面,花了前面这么多篇幅讲解,主要是想由浅入深,否则一上来给你们讲解这讲解那的,听的也一头雾水,反而得不到效果。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" });