类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 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...
随机推荐
- HTML5-video标签-实现点击预览图播放或暂停视频
HTML5-video标签-实现点击预览图播放或暂停视频 刚刚参加工作,开始更多的接触到一些新的知识,促使我开始了解html5和css3的新特性.这时我才真的发现到html5和css3的强大. 之前关 ...
- C#7.0中有哪些新特性?
以下将是 C# 7.0 中所有计划的语言特性的描述.随着 Visual Studio “15” Preview 4 版本的发布,这些特性中的大部分将活跃起来.现在是时候来展示这些特性,你也告诉借此告诉 ...
- LINQ to SQL语句(20)之存储过程
在我们编写程序中,往往需要一些存储过程,在LINQ to SQL中怎么使用呢?也许比原来的更简单些.下面我们以NORTHWND.MDF数据库中自带的几个存储过程来理解一下. 1.标量返回 在数据库中, ...
- Devexpress GridControl.Export
private void mnuExportTable_ItemClick_1(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { u ...
- C#开发微信门户及应用(35)--微信支付之企业付款封装操作
在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...
- shell编程
最吸引人的莫过于及时看到成果的努力,echo就是最好的初学者反馈函数,因为它的存在你可以及时的打印出结果. 1.分支 if[ ]:then elif ;then else fi 2.简单的循环,循环是 ...
- Boost条件变量condition_variable_any
Boost条件变量可以用来实现线程同步,它必须与互斥量配合使用.使用条件变量实现生产者消费者的简单例子如下,需要注意的是cond_put.wait(lock)是在等待条件满足.如果条件不满足,则释放锁 ...
- phpexcel导出数据表格
1.下载phpexcel(李昌辉) 2.在页面引入phpexcel的类文件,并且造该类的对象 include("../chajian/phpexcel/Classes/PHPExcel.ph ...
- ArcGIS Engine开发之TocControl
TocControl控件简介 TocControl控件的主要作用是显示当前加载的图层有哪些.采用什么样的符号等,目的是使用户对当前加载的数据有一个总体的把握.与之相关联的伙伴控件有:MapContro ...
- Android Weekly Notes Issue #224
Android Weekly Issue #224 September 25th, 2016 Android Weekly Issue #224 本期内容包括: Google Play的pre-lau ...