V1.x版本终于到来了。本次版本的开发从3月份开始,花了一个月的时间完成了概念版本设计、开发。到了4月份进行屡次的内核的重构设计。到了5月份进行大规模的BUG修复、代码优化。app
截止到今天(6月初),已知的BUG都已修复,并已在2个项目中应用了,而且运行良好。框架
一、新增队列管理:ide
新版本改变了V0.x时的使用方式,以Entityframework为模型进行参考设计。工具
在新版中,多了队列的概念,也就是咱们在对表进行操做时,并非单句运行的,常常是一段逻辑里面会对不一样的表进行屡次的操做。优化
最后在进行SaveChange()时,经过队列管理(QueueManger)迭代全部队列(Queue)进行委托执行提交到数据库。编码
这里面涉及到了延迟执行的概念。 但一旦遇到“查询”的SQL操做时,会提早提交代码到数据库。spa
二、新增数据库操做:
1 Table.Data.User.Insert(new UserVO() { UserName = "yy" });
1 using (var context = new Table()) 2 { 3 var info = new UserVO() { UserName = "xx" }; 4 context.User.Insert(info); 5 context.SaveChanges(); 6 }
在旧版本中只提供了第一种方式,而在新版本中,多了第二种方式。
在第二种方式中,只有在context.SaveChanges();以后才会对数据库的操做生效。这是从调用的角度来讲的,固然新版本中,内核处理方式彻底改变了。
采用new Table()方式,则会延迟到SaveChange()时才转换成Sql,生成Sql参数化,而后提交到数据库(默认事务方式,容许手动关闭),这里相似EntityFramework的方式。
三、改变的实体类(再也不须要继承基类了):
1 /// <summary> 2 /// 数据库上下文 3 /// </summary> 4 public class Table : DbContext<Table> 5 { 6 /// <summary> 7 /// 加载表时触发 8 /// </summary> 9 protected override void CreateModelInit(Dictionary<string, SetDataMap> map) 10 { 11 // 设置一张表的名称、主键、外键 12 map["User"].SetName("Members_User"); 13 map["UserRole"].SetName("Members_Role"); 14 map["Orders"].SetName("Members_Orders"); 15 } 16 17 /// <summary> 18 /// 默认为0时,可不显示填写这一项,当前只是为了演示 19 /// </summary> 20 public Table() : base(0) 21 { 22 } 23 24 /// <summary> 普通表 </summary> 25 public TableSet<UserVO> User { get; set; } 26 27 /// <summary> 缓存表 </summary> 28 public TableSetCache<UserRoleVO> UserRole { get; set; } 29 30 /// <summary> 普通表(GUID主键) </summary> 31 public TableSet<OrdersVO> Orders { get; set; } 32 33 }
看了上面的实体类映射,是否是以为很像EntityFramework的DbContext、DbSet呢。
UserVO 继承 IEntity<int?> 并非必须的。继承它后,框架会提供一些额外的扩展支持。(后面文章在详细述说)
在新版本中,主键int ID不是强制性的继承了。
PO、VO的分离。在旧版本中,若是有多张表的字段结构彻底同样,则在映射时必需要为每张表定义同样的实体类。这对项目而言是臃肿的代码。
在新版本中,VO脱离了框架的束缚,由Table来决定我这张表由“谁”来映射它的结构,这会给咱们的实现项目中带来很是灵活的编码方式,好比多个数据库表对应同一个VO实体。
四、Map分离了:
在旧版本中,由于实体类只有一个,没有分离。因此对整个class进行了映射并缓存。
而在新版本中,Map区分了:结构性的Map与非结构性的Map。
这样区分的目地是由于结构性的Map是运行时固定不变的,能够进行缓存。而非结构性的Map,包含了用户定义(动态改变)的数据。因此不进行缓存处理。
它们在命名空间:FS.Sql.Map中
在这里,你们有所了解就行。实际项目中用到不大,更多的是FS.Core中内部的调用。它标记了各个实体类的映射关系。
五、统一了缓存的管理:
在原来的版本中,有些缓存的(好比反射的、枚举中文名称的、ORM的)是存在各自的管理中。
而在新版本中,将统一放到FS.Cacher中。并提供了Clear()方法进行清除全部缓存。
六、结构的分离:
以上讲的是调用方式的改变以及实体类映射的改变。为了更方便于开源推广,框架在结构上也进行了分离:
在实际项目中,你们可能不会用到除ORM之外的工具类(你们有自已经常使用的工具类)。所以分离出来,让ORM更加专一。
所以本系列教程,只讲解Farseer.Net相关代码,其它工具类请你们自行下截后研究。(其实也没什么可研究性,就只是一些工具类方法)
两个版本的区别是巨大的,做者在新版本中是进行了彻底的重写,因此本篇中不能一一描述新旧版本的区别。本篇中仅是给你们带来一个初步的印象,后面的篇幅,咱们会一一讲解每一个运用。
七、全新的编码方式:
最后,咱们在贴一段综合调用的例子给你们:
1 using (var context = new Table()) 2 { 3 var info = context.User.Where(o => o.ID > 0 && o.CreateAt < DateTime.Now).Desc(o => new { o.ID, o.LoginCount }).Asc(o => o.GenderType).ToEntity(); 4 info.PassWord = "77777"; 5 context.User.Where(o => o.ID == 1).Update(info); 6 7 info.ID = null; 8 info.PassWord = "00000New"; 9 context.User.Insert(info); 10 11 12 context.User.Where(o => o.ID == 1).Append(o => o.LoginCount, 1).AddUp(); 13 context.User.AddUp(o => o.LoginCount, 1); 14 context.UserRole.ToList(); 15 context.UserRole.Where(o => o.ID == 1).ToList(); 16 context.UserRole.Where(o => o.ID > 1).ToList(); 17 var lst = context.User.Where(o => o.ID > 0).Desc(o => new { o.ID, o.LoginCount }).Asc(o => o.GenderType).ToList(); 18 19 context.SaveChanges(); 20 }
1 new Table().User.Where(o => o.ID > 0).ToList(); 2 Table.Data.User.AddUp(o => o.LoginCount, 1); 3 Table.Data.User.Where(o => o.ID > 0).ToList(); 4 Table.Data.Set<UserVO>().Where(o => o.ID > 0).ToList();
本篇不会讲太多实质性的代码,主要是讲解下新旧版本的对比,让你们有个直观的印象。
本篇就讲解到这,后面的篇幅将开始真正带领你们认识新框架的魅力了。
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" });