扯淡

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升级:只为更完美的更多相关文章

  1. [开源].NET数据库访问框架Chloe.ORM

    扯淡 13年毕业之际,进入第一家公司实习,接触了 EntityFramework,当时就觉得这东西太牛了,访问数据库都可以做得这么轻松.优雅!毕竟那时还年轻,没见过世面.工作之前为了拿个实习机会混个工 ...

  2. EF框架学习手记

    转载: [ASP.NET MVC]: - EF框架学习手记 1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架 ...

  3. [ASP.NET MVC]: - EF框架学习手记

    1.EF(Entity Framework)实体框架EF是ADO.NET中的一组支持开发面向数据的软件应用程序的技术,是微软的一个ORM框架. 2.什么是ORM?ORM指的是面向对象的对象模型和关系型 ...

  4. 【EF 4】ORM框架及其流行产品之一EF介绍

    导读:跳进了多租户切换数据库的坑,那么就继续走下去吧.在我们的项目中,是运用EF实现对数据库的操作,那么EF其实是.NET系统中,基于ORM框架的一个产品实现.在java那边,则有Hibernate和 ...

  5. Chloe.ORM框架应用实践

    Chloe.ORM 是国人开发的一款数据库访问组件,很是简单易用.目前支持四种主流数据库:SqlServer.MySQL.Oracle,以及Sqlite,作者为这四种数据库划分出了各自对应的组件程序集 ...

  6. [开源]无sql之旅-Chloe.ORM之增删查改

    扯淡 这是一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...

  7. [开源].NET高性能框架Chloe.ORM-完美支持.NET Core

    扯淡 这是一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...

  8. 高品质开源工具Chloe.ORM:支持存储过程与Oracle

    扯淡 这是一款高质量的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq.借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询.聚合查询.插入数据.批量删 ...

  9. [开源].NET高性能框架Chloe.ORM-完美支持SQLite

    扯淡 这是一款轻量.高效的.NET C#数据库访问框架(ORM).查询接口借鉴 Linq(但不支持 Linq).借助 lambda 表达式,可以完全用面向对象的方式就能轻松执行多表连接查询.分组查询. ...

随机推荐

  1. JS魔法堂:不完全国际化&本地化手册 之 拓展篇

    前言  最近加入到新项目组负责前端技术预研和选型,其中涉及到一个熟悉又陌生的需求--国际化&本地化.熟悉的是之前的项目也玩过,陌生的是之前的实现仅仅停留在"有"的阶段而已. ...

  2. Hadoop学习之旅一:Hello Hadoop

    开篇概述 随着计算机网络基础设施的完善,社交网络和电商的发展以及物连网的推进,产生了越来越多的大数据,使得人工智能最近几年也有了长足的发展(可供机器学习的样本数据量足够大了),大数据的存储和处理也越来 ...

  3. React-Native学习系列(一)

    近段时间一直在忙,所以博客也没有更新,这两天我翻了一下写的这几篇博客,感觉写的都很片面,所以,我想重新写一个系列教程,从最基础的开始,来让大家更容易学会React-Native. 这个系列大部分只介绍 ...

  4. H5天气查询demo(二)

    最近刚好有空,学长帮忙让做个毕设,于是我提到了那个基于H5地理位置实现天气查询的方法,学长听了也觉得不错,于是就这个主题,扩展了一下,做了一个航班管理查询系统,为上次博客中提到的利用H5 api中的经 ...

  5. spring mvc 和spring security配置 web.xml设置

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmln ...

  6. Amazon Interview | Set 27

    Amazon Interview | Set 27 Hi, I was recently interviewed for SDE1 position for Amazon and got select ...

  7. 《连载 | 物联网框架ServerSuperIO教程》- 12.服务接口的开发,以及与云端双向交互

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  8. 跨平台日志清理工具 Log-Cutter v2.0.1 正式发布

    Log-Cutter 是JessMA开源组织开发的一个简单实用的日志切割清理工具.对于服务器的日常维护来说,日志清理是非常重要的事情,如果残留日志过多则严重浪费磁盘空间同时影响服务的性能.如果用手工方 ...

  9. node使用xml-writer生成本地XML文件实例

    npm中xml-writer文档的链接地址:https://www.npmjs.com/package/xml-writer npm中的文档比较简单,而且生成本地xml文件的demo并不正确.本篇是对 ...

  10. [FromBody]与[FromUrl]

    我们都知道,前台请求后台控制的方法有get方法和post方法两种, get:只支持ulr传数据,不管你是手动把参数拼接在Url里面还是写在data里面,只要是用get方法,都会自动绑定到url里面的形 ...