类EF框架Chloe.ORM升级:只为更完美
扯淡
Chloe.ORM:一款轻量、高效的.NET C#数据库访问框架(ORM)。查询接口借鉴 Linq(但不支持 Linq)。借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询、分组查询、聚合查询、插入数据、批量删除和更新等操作。
为什么叫类EF?如果看过我之前文章介绍的同学可能会了解,Chloe 的查询接口和 Linq 几乎一模一样,因为查询接口就是照搬 Linq 而来。可能有人会奇怪,为啥不自己设计一套呢?呃...这的确有过。设计之初,我也构思了一套又一套的查询接口,但后来没用。因为所谓的新“接口”,无非也就是方法名字不同,功能却都是的一样的,比如创建查询入口,EF 是 DbContext.Set<T>(),有的是 XX.From<T>(),有的是 XX.Query<T>();又比如分页,我们自己设计的话,无非就是 Limit,Page,GetPage 等这几个方法名。甚至也可以不带任何 Linq 思想创新一套全然不同的接口,一种新“语法”,但折腾来折腾去,还是没 Linq 设计的巧妙与好用。既然咱创新不了比 Linq 更好的接口,因此,我直接照搬 Linq 了。当然了,如果确实不想沾上任何 EF 或者 Linq 的影子,最好还是自己设计吧。看个人喜好,Linq 的影子足够完美,我只是选择站在巨大前人的肩膀上罢了!
Chloe.ORM 从年初投入生产使用已经半年有余,从最初蹒跚走路到现在稳健安康,经历了不少风雨改动。开源以来大家看到的都是经过无数次大大小小修改后的版本。这次改动升级,都是实际使用过程和开源后做了多数据库支持发现的一些问题与改进点,如下:
更新内容
实体增加默认主键机制
在 1.* 版本中,要求实体必须显示标记主键成员和自增列。现修改后的版本不需要了,当一个实体没显示指定主键的时候,Chloe 默认选择名为 Id 的属性作为主键列,与此同时,如果该实体也没有显示指定任何自增列并且 Id 属性为 Int16、Int32 或者 Int64 类型,则也会默认其为自增列。
给实体增加默认机制,其实我内心是拒绝的。因为我讨厌这些隐士的默认,看不到显示指定 PrimaryKey 或者打上 AutoIncreamentAttribute 标签,我心里不自在- -。之前设计框架的时候我也深度考虑过这个问题,刚开始我以为我可以接受写实体时必须显示标记主键和自增列的工作量。但,在实际生产使用过程发现,实体多起来,这重复性强,很繁琐,虽然仅仅是打两个特性的工作而已。因此,我不得不在我的个人原则上做妥协,只能默默的改了- -
参数化 Sql 中对 string 参数固定Size
在数据库中,有个执行计划的概念,在参数化的 Sql 对 string 类型参数进行固定 Size,一定程度上会提高数据库性能。在 Chloe 1.* 版本中,参数值的长度是多少,参数设置的 Size 就是多少,这个可能会影响性能,因为执行计划得不到重用。现新版本中修改将 string 类型的参数 Size 属性统一设置为 4000。
调整聚合接口 Max 和 Min
在 1.* 版本中,聚合接口 Max 和 Min 只支持对数值类型操作。在上周做公司项目开发时,有需要对日期字段进行求 Max 和 Min,发现 Chloe 不支持…好吧,我承认这接口设计的不好,或者说当时照搬 Linq 时做的不够彻底- -二话不说,改!so,现在可以 q.Max<DateTime>(a=> a.OpTime) 和 q.Min<DateTime>(a=> a.OpTime) 了~
Issues 修改
- MySql、SQLite 数据库 Provider 的 DbContext.Insert<T>(Expression<Func<T>> body) 方法:当一个实体中存在自增列,但该列不是主键,调用该方法插入数据时,在 1.* 版本中会返回自增列值,而不是主键值,这是个 Bug(SqlServer不受影响)。在 2.* 版本中这种情况已修改为返回正确的主键值。
- 在 1.* 版本中,执行 q.Where(a=> a.OpTime == date) 没问题,但执行类似 q.Where(a=> a.OpTime.Value.Date == date) 时会引发异常,因为解析 Lambda 表达式树时,不支持解析 a.OpTime.Value.Date,早期没考虑到这点,所以会出现异常。在最新版中已修正支持。
- 在 1.* 版本中,DateTime.Now、DateTime.UtcNow 出现在 ==、!= 运算符两侧时,并未解析成理想的 Sql GETDATE() 和 GETUTCDATE(),而是直接求值。 在最新版中已修正该问题。
- 在调用 Select 方法时,如果 selector 主体出现两个相同的静态方法,会出现异常,如 q.Select(a=> new { MinAge = AggregateFunctions.Min(a.Age), MinHeight = AggregateFunctions.Min(a.Height)})。在最新版中已修正支持。
做程序开发的都知道,没人能写出完美的软件,或多或少会有 Bug,只是没被发现罢了。LZ 在之前的文章吹了一波NB说 Chloe“零Bug”,并不是说它没有任何缺陷,本意是 Chloe 的问题相对很少,很少…
结语
Chloe.ORM 已经成为我们公司核心项目的持久层框架,已经完全替代了之前的 EF。开源的一个多月里,我视其如孩子,一直在完善与改进,我想把她最好的姿态展现给大家,大到一个接口,小到一行代码,一个变量。即使我正在度假中,也不忘 make her beautiful!也许,这就是开源的动力。
这次改动,版本也随之升级为 2.0,较之前的 1.* 版本又稳健了许多。接下来,Chloe 又可以继续她多数据库支持之路了。Oracle?PostgreSql?敬请期待!
Chloe.ORM 完全开源,遵循 Apache2.0 协议,托管于 GitHub,地址:https://github.com/shuxinqin/Chloe。
相关介绍:http://www.cnblogs.com/so9527/p/5636216.html
类EF框架Chloe.ORM升级:只为更完美的更多相关文章
- [开源].NET数据库访问框架Chloe.ORM
扯淡 13年毕业之际,进入第一家公司实习,接触了 EntityFramework,当时就觉得这东西太牛了,访问数据库都可以做得这么轻松.优雅!毕竟那时还年轻,没见过世面.工作之前为了拿个实习机会混个工 ...
- EF框架学习手记
转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...
- [ASP.NET MVC]: - EF框架学习手记
1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架. 2.什么是ORM?ORM指的是面向对象的对象模型和关系型 ...
- 【EF 4】ORM框架及其流行产品之一EF介绍
导读:跳进了多租户切换数据库的坑,那么就继续走下去吧.在我们的项目中,是运用EF实现对数据库的操作,那么EF其实是.NET系统中,基于ORM框架的一个产品实现.在java那边,则有Hibernate和 ...
- Chloe.ORM框架应用实践
Chloe.ORM 是国人开发的一款数据库访问组件,很是简单易用.目前支持四种主流数据库:SqlServer.MySQL.Oracle,以及Sqlite,作者为这四种数据库划分出了各自对应的组件程序集 ...
- [开源]无sql之旅-Chloe.ORM之增删查改
扯淡 这是一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...
- [开源].NET高性能框架Chloe.ORM-完美支持.NET Core
扯淡 这是一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...
- 高品质开源工具Chloe.ORM:支持存储过程与Oracle
扯淡 这是一款高质量的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq.借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询.聚合查询.插入数据.批量删 ...
- [开源].NET高性能框架Chloe.ORM-完美支持SQLite
扯淡 这是一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...
随机推荐
- Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)
Android ScrollView监听滑动到顶部和底部,虽然网上很多资料都有说,但是不全,而且有些细节没说清楚 使用场景: 1. 做一些复杂动画的时候,需要动态判断当前的ScrollView是否滚动 ...
- 灵活可扩展的工作流管理平台Airflow
1. 引言 Airflow是Airbnb开源的一个用Python写就的工作流管理平台(workflow management platform).在前一篇文章中,介绍了如何用Crontab管理数据流, ...
- ES6笔记(5)-- Generator生成器函数
系列文章 -- ES6笔记系列 接触过Ajax请求的会遇到过异步调用的问题,为了保证调用顺序的正确性,一般我们会在回调函数中调用,也有用到一些新的解决方案如Promise相关的技术. 在异步编程中,还 ...
- eclipse中Maven运行时报错: -Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable and mvn script match.
1.安装 Maven 如果需要使用到 Maven ,必须首先安装 Maven , Maven 的下载地址在 Apache Maven 中有,您也可以点击这里下载 zip ,tar.gz. 下载好 Ma ...
- Configure bridge on a team interface using NetworkManager in RHEL 7
SOLUTION IN PROGRESS February 29 2016 KB2181361 environment Red Hat Enterprise Linux 7 Teaming,Bridg ...
- python学习笔记(python简史)
一.python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum) 目前python主要应用领域: ·云计算 ·WEB开发 ·科学运算.人工智能 ·系统运维 ·金融:量化交 ...
- 一个java文件中可包含多个main方法
java中的main方法是java应用程序的入口,java程序在运行时,首先调用执行main方法.但并不是说java中只能有一个main方法,不同类中都可以包含main方法.当JVM进行编译时,会提示 ...
- 运算符.png
- 【HTML5&CSS3进阶04】CSS3动画应该如何在webapp中运用
动画在webapp的现状 webapp模式的网站追求的就是一个体验,是HTML5&CSS3浪潮下的产物,抛开体验不说,webapp模式门槛比较高: 而体验优化的一个重点便是动画,可以说动画是w ...
- UI篇(初识君面)
我们的APP要想吸引用户,就要把UI(脸蛋)搞漂亮一点.毕竟好的外貌是增进人际关系的第一步,我们程序员看到一个APP时,第一眼就是看这个软件的功能,不去关心界面是否漂亮,看到好的程序会说"我 ...