Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明
上一篇:没有了
下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置
V1.x版本终于到来了。本次版本的开发从3月份开始,花了一个月的时间完成了概念版本设计、开发。到了4月份进行多次的内核的重构设计。到了5月份进行大规模的BUG修复、代码优化。
截止到今天(6月初),已知的BUG都已修复,并已在2个项目中应用了,并且运行良好。
1、新增队列管理:
新版本改变了V0.x时的使用方式,以Entityframework为模型进行参考设计。
在新版中,多了队列的概念,也就是我们在对表进行操作时,并不是单句运行的,经常是一段逻辑里面会对不同的表进行多次的操作。
最后在进行SaveChange()时,通过队列管理(QueueManger)迭代所有队列(Queue)进行委托执行提交到数据库。
这里面涉及到了延迟执行的概念。 但一旦遇到“查询”的SQL操作时,会提前提交代码到数据库。
2、新增数据库操作:
Table.Data.User.Insert(new UserVO() { UserName = "yy" });
using (var context = new Table())
{
var info = new UserVO() { UserName = "xx" };
context.User.Insert(info);
context.SaveChanges();
}
在旧版本中只提供了第一种方式,而在新版本中,多了第二种方式。
在第二种方式中,只有在context.SaveChanges();之后才会对数据库的操作生效。这是从调用的角度来说的,当然新版本中,内核处理方式完全改变了。
采用new Table()方式,则会延迟到SaveChange()时才转换成Sql,生成Sql参数化,然后提交到数据库(默认事务方式,允许手动关闭),这里类似EntityFramework的方式。
3、改变的实体类(不再需要继承基类了):
/// <summary>
/// 数据库上下文
/// </summary>
public class Table : DbContext<Table>
{
/// <summary>
/// 加载表时触发
/// </summary>
protected override void CreateModelInit(Dictionary<string, SetDataMap> map)
{
// 设置一张表的名称、主键、外键
map["User"].SetName("Members_User");
map["UserRole"].SetName("Members_Role");
map["Orders"].SetName("Members_Orders");
} /// <summary>
/// 默认为0时,可不显示填写这一项,当前只是为了演示
/// </summary>
public Table() : base()
{
} /// <summary> 普通表 </summary>
public TableSet<UserVO> User { get; set; } /// <summary> 缓存表 </summary>
public TableSetCache<UserRoleVO> UserRole { get; set; } /// <summary> 普通表(GUID主键) </summary>
public TableSet<OrdersVO> Orders { get; set; } }
看了上面的实体类映射,是不是觉得很像EntityFramework的DbContext、DbSet呢。
UserVO 继承 IEntity<int?> 并不是必须的。继承它后,框架会提供一些额外的扩展支持。(后面文章在详细述说)
在新版本中,主键int ID不是强制性的继承了。
PO、VO的分离。在旧版本中,如果有多张表的字段结构完全一样,则在映射时必须要为每张表定义一样的实体类。这对项目而言是臃肿的代码。
在新版本中,VO脱离了框架的束缚,由Table来决定我这张表由“谁”来映射它的结构,这会给我们的实现项目中带来非常灵活的编码方式,比如多个数据库表对应同一个VO实体。
4、Map分离了:
在旧版本中,因为实体类只有一个,没有分离。所以对整个class进行了映射并缓存。
而在新版本中,Map区分了:结构性的Map与非结构性的Map。
这样区分的目地是因为结构性的Map是运行时固定不变的,可以进行缓存。而非结构性的Map,包含了用户定义(动态改变)的数据。所以不进行缓存处理。
它们在命名空间:FS.Sql.Map中
在这里,大家有所了解就行。实际项目中用到不大,更多的是FS.Core中内部的调用。它标记了各个实体类的映射关系。
5、统一了缓存的管理:
在原来的版本中,有些缓存的(比如反射的、枚举中文名称的、ORM的)是存在各自的管理中。
而在新版本中,将统一放到FS.Cacher中。并提供了Clear()方法进行清除所有缓存。
6、结构的分离:
以上讲的是调用方式的改变以及实体类映射的改变。为了更方便于开源推广,框架在结构上也进行了分离:
- Farseer.Net:基础类库。
- Farseer.Net.Sql:本篇教程的类库:Orm
- Farseer.Net.Utils:提供常用的工具类(但不与WinForm、WebForm、MVC有任何的关联)
- Farseer.Net.Utils.Form:提供WinForm的相关工具
- Farseer.Net.Utils.Web:提供WebForm、MVC的相关工具
在实际项目中,大家可能不会用到除ORM以外的工具类(大家有自已常用的工具类)。因此分离出来,让ORM更加专注。
因此本系列教程,只讲解Farseer.Net相关代码,其它工具类请大家自行下截后研究。(其实也没什么可研究性,就只是一些工具类方法)
两个版本的区别是巨大的,作者在新版本中是进行了完全的重写,所以本篇中不能一一描述新旧版本的区别。本篇中仅是给大家带来一个初步的印象,后面的篇幅,我们会一一讲解每个运用。
7、全新的编码方式:
最后,我们在贴一段综合调用的例子给大家:
using (var context = new Table())
{
var info = context.User.Where(o => o.ID > && o.CreateAt < DateTime.Now).Desc(o => new { o.ID, o.LoginCount }).Asc(o => o.GenderType).ToEntity();
info.PassWord = "";
context.User.Where(o => o.ID == ).Update(info); info.ID = null;
info.PassWord = "00000New";
context.User.Insert(info); context.User.Where(o => o.ID == ).Append(o => o.LoginCount, ).AddUp();
context.User.AddUp(o => o.LoginCount, );
context.UserRole.ToList();
context.UserRole.Where(o => o.ID == ).ToList();
context.UserRole.Where(o => o.ID > ).ToList();
var lst = context.User.Where(o => o.ID > ).Desc(o => new { o.ID, o.LoginCount }).Asc(o => o.GenderType).ToList(); context.SaveChanges();
}
new Table().User.Where(o => o.ID > ).ToList();
Table.Data.User.AddUp(o => o.LoginCount, );
Table.Data.User.Where(o => o.ID > ).ToList();
Table.Data.Set<UserVO>().Where(o => o.ID > ).ToList();
本篇不会讲太多实质性的代码,主要是讲解下新旧版本的对比,让大家有个直观的印象。
本篇就讲解到这,后面的篇幅将开始真正带领大家认识新框架的魅力了。
上一篇:没有了
下一篇: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 入门篇:新版本说明 下一篇:Farseer.net轻量级ORM开源框架 ...
- Farseer.net轻量级ORM开源框架 V1.x 教程目录
本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个 ...
随机推荐
- 借助ltp 逐步程序化实现规则库 文本生成引擎基于规则库和业务词库 去生成文本
[哪个地方做什么的哪家靠谱?地名词库行业.业务词库]苏州做网络推广的公司哪家靠谱?苏州镭射机维修哪家最专业?昆山做账的公司哪家比较好广州称重灌装机生产厂家哪家口碑比较好 [含有专家知识]郑州律师哪个好 ...
- 理解ValueStack的基本机制
ValueStack基础:OGNL(Object Graphic Navigation Language) OGNL是Struts2中使用的一种表达式语言.它可以用于: · 在JSP页面,使用标签 ...
- 在 Vim 中优雅地查找和替换 vi【转】
本文转载自:http://harttle.land/2016/08/08/vim-search-in-file.html 总有人问我 Vim 中能不能查找,当然能!而且是超级强的查找! 这篇文章来详细 ...
- How to check HTML version of any website
http://howtocheckversion.com/check-html-version-website/ Check HTML version via W3C W3 Consortium ha ...
- YTU 2411: 谁去参加竞赛?【简单循环】
2411: 谁去参加竞赛?[简单循环] 时间限制: 1 Sec 内存限制: 64 MB 提交: 461 解决: 261 题目描述 学校要举办大学生程序设计竞赛,老师要求期末考试成绩在平均成绩以上的 ...
- 蓝牙4.0 BLE 广播包解析
在使用EN-Dongle捕获和解析广播包之前,我们先了解一下BLE报文的结构,之后,再对捕获的广播包进行分析.在学习BLE的时候,下面两个文档是极其重要的,这是SIG发布的蓝牙的核心协议和核心协议增补 ...
- 浅谈Linux Kernel 中循环链表的实现
前阵子在弄缓存的时候,我们需要将qemu对于磁盘镜像文件写请求串成一个链表,最终将这个链表里面的写请求全部刷回到镜像文件里面,那么我们便需要一个强健,可靠的链表的接口,于是我们仿照Linux 2.4. ...
- es的forcemerge——按照天分割
归并线程配置 segment 归并的过程,需要先读取 segment,归并计算,再写一遍 segment,最后还要保证刷到磁盘.可以说,这是一个非常消耗磁盘 IO 和 CPU 的任务.所以,ES 提供 ...
- Linux设备模型 (1)
随着计算机的周边外设越来越丰富,设备管理已经成为现代操作系统的一项重要任务,这对于Linux来说也是同样的情况.每次Linux内核新版本的发布,都会伴随着一批设备驱动进入内核.在Linux内核里,驱动 ...
- Struts2自定义返回Json类型result
本来Struts2有自己的json类型的返回结果,并提供了插件,但是它有一个问题,那就是它会将所有序列化的字段都返回,如果想要制定返回Action的某一个属性,则需要在配置result时,配置参数(这 ...