Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文
上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件
下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射
上文讲述了数据库配置使用,搭建好数据库的链接方式了我们知道怎么做了。
事实上,至今我们仍然还没有讲到代码方面,花了前面这么多篇幅讲解,主要是想由浅入深,不然一上来给大家讲解这讲解那的,听的也一头雾水,反而得不到效果。
这篇比较重要,因为它是我们在使用Farseer.Net时最基础的类:DbContext(与EntityFramework的DbContext一个概念)
从字面上,我们就知道:它是我们程序(业务)与数据库之间的沟通桥梁,在对表(实体类)进行CURD时,需要让实体类知道,我需要访问哪种数据库。
而数据库上下文,就是告诉我们的实体类,应该对哪个数据库类型进行连接访问。
在Farsser.Net里,数据库上下文对应的类便是:DbContext,这便是需要我们继承它,然后在这个类里面,封装我们需要的实体类的属性。
/// <summary>
/// 通过数据库配置,连接数据库
/// </summary>
/// <param name="dbIndex">数据库选项</param>
protected DbContext(int dbIndex = ) /// <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 = )
带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>的:
/// <summary>
/// 数据库上下文
/// </summary>
public class Table : DbContext<Table>
{
/// <summary>
/// 默认为0时,可不显示填写这一项,当前只是为了演示
/// </summary>
public Table() : base() { } [Set(Name = "Members_User")]
public TableSet<UserVO> User { get; set; } [Set(Name = "Members_Role")]
public TableSetCache<UserRoleVO> UserRole { get; set; }
[Set(Name = "Members_Orders")]
public TableSet<OrdersVO> Orders { get; set; } [Set(Name = "Members_Orders")]
[SortDelete(Name = "IsDeleteByAt", FieldType = eumSortDeleteType.DateTime, Value = true)]
public TableSet<OrdersVO> OrdersAt { get; set; } [Set(Name = "Members_Orders")]
[SortDelete(Name = "IsDeleteByBool", FieldType = eumSortDeleteType.Bool, Value = true)]
public TableSet<OrdersVO> OrdersBool { get; set; } [Set(Name = "Members_Orders")]
[SortDelete(Name = "IsDeleteByNum", FieldType = eumSortDeleteType.Number, Value = )]
public TableSet<OrdersVO> OrdersNum { get; set; }
}
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)
这一篇,大家学会了数据库上下文的代码编写了,虽然篇幅很长,但其实就是那么一回事,简单的不能再简单了。
上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件
下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射
QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net
Farseer.Net是一款ORM框架 + 常用工具 + 扩展集合。
Farseer 寓意:先知、预言家 通常在某些场合时,提供计谋、策略。也希望该框架能给大家提供最大化的便捷。
ORM:其英文全称是:Object(对象) Relational(关系) Mapping(映射)
Farseer.Net的目标是:快速上手、快速开发、简单方便。
Table.Data.User.Where(o=>o.ID == ).ToEntity();
Table.Data.User.Where(o=>o.ID > ).ToList();
Table.Data.User.Where(o=>o.ID != ).Delete();
Table.Data.User.Where(o=>o.ID != ).AddUp(o=>o.LoginCount, );
Table.Data.User.Where(o=>o.ID == ).Update(new User{ UserName = "newName" });
Table.Data.User.Insert(new User{ UserName = "newName" });
Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文的更多相关文章
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射 下一篇:Farseer.net轻量级ORM开源 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 下一篇:Farseer.net轻量级ORM开源 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 下一篇:Farseer.net轻量级ORM开源框 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文 下一篇:Farseer.net轻量级ORM开源框 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级ORM开源框架 ...
- Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明
导航 目 录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...
- Farseer.net轻量级ORM开源框架 V1.x 教程目录
本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个 ...
随机推荐
- C控制台密码输入:输入一个字符显示一个星号
要在c控制台中输入一个字符显示一个星号, 则不能用"stdio.h'提供的库函数,因为它们都是带回显的,比如getchar() getchar()用来接收输入的字符串,输入一个字符就回显一个 ...
- Pulse-code modulation
脉冲编码调制(Pulse Code Modulation,PCM),由A.里弗斯于1937年提出的,这一概念为数字通信奠定了基础,60年代它开始应用于市内电话网以扩充容量,使已有音频电缆的大部分芯线的 ...
- Class.forName() 详解
主要功能 Class.forName(xxx.xx.xx)返回的是一个类 Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类, 也就是说JVM会执行该类的静态代码段 ...
- LDAP方式连接AD获取用户信息
LDAP资料介绍可以参考:http://wenku.baidu.com/view/262742f9f705cc17552709f9.html ldap访问AD域的的错误一般会如下格式: Ldap lo ...
- PP-判断生产订单状态(关闭)
方法一.工单号通过 resb找到对象号 然后找到状态为I0045利用表JEST与TJ02T . 方法二.函数'STATU_CHECK' 检查工单状态为'I0045' 则为已做技术性关闭. READ T ...
- bzoj1560: [JSOI2009]火星藏宝图
考虑到一个性质,A到B的距离一定不小于A到C再到B的距离,因为能够到达这三个点不可能构成锐角三角形 对于当前点的更新只需要找那些无法经过其它点再到当前点的点,相当于是一个y坐标单调减的上凸包,随便维护 ...
- YTU 2558: 游起来吧!超妹!
2558: 游起来吧!超妹! 时间限制: 1 Sec 内存限制: 128 MB 提交: 70 解决: 22 题目描述 夏天到了,无聊的超妹跑到了落雪湖里抓鱼吃.结果,游到湖的正中 央时被湖边保安看 ...
- YTU 2980: 几点了
2980: 几点了 时间限制: 1 Sec 内存限制: 128 MB 提交: 37 解决: 9 题目描述 现有一个Time类可以用来记录时间,请输出Time记录的时间加上s秒后的时间. 只需提交补 ...
- JSTL1.1函数标签库(functions)如fn:length
JSTL1.1函数标签库(functions)如fn:length 分类: java ssh22012-06-11 09:02 313人阅读 评论(1) 收藏 举报 stringcharacterxm ...
- frameset 框架整体退出登录的问题
1 设置其他的页面都验证session,如果session不存在就跳转到 Login 页: 2 Login中添加下面的js代码: <script language="JavaScrip ...