最近在研究ORM,究竟什么样的框架才是我们想要的

开发框架的意义在于

  • 开发更标准,更统一,不会因为不同人写的代码不一样
  • 开发效率更高,无需重新造轮子,重复无用的代码,同时简化开发流程
  • 运行效率得到控制,程序稳定性得到提高

把网上关注比较多的框架搜了搜,作了个列表

  1. Nhibernate
    来源于Java的Hibernate
    参考:http://www.cnblogs.com/ylwn817/articles/1963528.html
  2. Entity Framework
    微软本家框架,都比较熟悉
  3. iBATIS.NET
    apache开源项目
    参考:http://developer.51cto.com/art/200907/137796.htm
  4. Nbear
    博客园Teddy开发的项目
    参考:http://www.cnblogs.com/teddyma/archive/2006/11/07/553562.html
  5. Castle ActiveRecord
    ActiveRecord是Hibernate的一个延伸
    参考:http://terrylee.cnblogs.com/archive/2006/04/03/365762.html

加再上其他人写的一些框架,包括自已写的,大差不差

整理了一些常用的特性,对这些框架作一个评分

  1. 可编程性(语法支持) 我们希望不再用字符串的形式拼接SQL,并且能通过编译验证
  2. 容错性 可看作是上面扩充,不希望一个地方改了,其它地方没改,没任何提示,造成错误
  3. 开发效率 包括框架的配置,开发过程
  4. 关联查询支持度 关联查询是不可避免的
  5. 额外配置 是否需要额外配置和第三方工具支持,影响开发效率
  6. 缓存支持 能大大增强程序效率

跟数据库打交道,最重要的功能当属查询了,查询做得好不好直接影响易用度,Lambda和Linq方式为首选

下面是对这些框架的分析,没有仔细研究,可能不对,只代表个人意见,仅供参考

Nhibernate

新版Nhibernate增加了Lambda和Linq查询支持

Join好像也能实现了

1
2
3
4
var list1 = session.CreateCriteria<Product>()
    .Add(Restrictions.Eq("Discontinued"false))
    .Add(Restrictions.Eq("Category.Id", 2))
    .List<Product>();

对缓存支持也有,有多种实现方式
http://www.cnblogs.com/lyj/archive/2008/11/28/1343418.html

只是一如既往需要配置XML映射

Entity Framework

在上述特性中,除了没有缓存,EF都比较完美,关且在最新版7中,强制了CodeFirst模式,是其它框架没有的(这样更符合业务开发模式)

有的说EF太过庞大,用不好效率会有些问题,确实,特别是关联,写不好就弄出没效率的SQL语句,这也正是他可编程性太强的缘故,如果不是这么强,就不会这么写,会想想把结构好好设计设计

由于太过于对象的概念,默认不支持批量更新/删除

iBATIS.NET

除了有基本的对象映射优点只剩灵活来描述了,所有操作都需要配置XML文件来表示

1
2
3
4
5
6
select id="GetAllAccountsAsHashMapViaResultMap"
                resultMap="account-hashtable-result"﹥ 
    select 
    from Accounts 
    order by Account_ID 
﹤/select

好像还支持缓存

1
2
3
4
5
6
7
select id="GetCachedAccountsViaResultMap"
            resultMap="account-result"
            cacheModel="account-cache" ﹥ 
    select 
    from Accounts 
    order by Account_ID 
﹤/select

这已经不属于面向对象,就是一个查询映射

Nbear

Nbear可以通过对象的方式自动映射对象关联,但不能直接关联查询
条件查询,参数化,不太智能,好像好长时间没更新了,不知现在是怎么查

1
LocalUser[] users = gateway.Select<LocalUser>(_Entity.LocalUser.Id > 5 | _Entity.LocalUser.LoginId == "teddy", _Entity.LocalUser.Id.Desc & _Entity.LocalUser.LoginId.Asc);

  

可以使用配置的方式支持缓存,好像只能单个表

1
2
3
4
5
<cacheConfig enable="true">
    <cachingTables>
      <add key="Northwind.Orders" value="5" />
    </cachingTables>
 </cacheConfig>

除了表映射外,还支持视图,存储过程映射,(这个其实已经脱离面向对象的概念了,设计好的业务对象,对这基本没需求)
对象定义是接口类型,不明白

1
2
3
4
5
6
7
8
9
10
11
public interface IdentableEntity : IEntity
 
       {
 
           [PrimaryKey]
 
           int Id { getset; }
 
           string Name { getset; }
 
       }

  

Castle ActiveRecord

ActiveRecord延伸于hibernate,少不了一堆数据库配置

也支持关联对象,通过属性定义

1
2
3
4
5
6
7
8
9
10
11
[HasMany(typeof(Post), Table="posts", ColumnKey="post_blogid")]
 
  public IList Posts
 
  {
 
      get return _posts; }
 
      set { _posts = value; }
 
  }

查询方式为方法传参,比较原始,不知最新的没有引入Linq和Lambda
http://terrylee.cnblogs.com/archive/2006/04/12/372823.html

1
SimpleQuery query = new SimpleQuery(
1
            typeof(Post),typeof(int),
1
           @"select post.Id from Post post where post.Created between ? and ?",
1
            start,end
1
            );

综合起来

  可编程性(语法支持) 容错性 开发效率 关联查询支持度 额外配置 缓存支持
Nhibernate Linq&Lambda语法 映射需要配置XML 支持
Entity Framework Linq&Lambda语法   不支持
iBATIS.NET XML配置查询 支持
Nbear 运算符重载 需要工具生成类 支持
Castle ActiveRecord   支持

查询

在设计ORM框架时,来表示查询一般分几种情况

  • 实现linq&Lambda语法糖,借助.NET框架实现表达式解析
  • 自已写表达式,实现类似的效果(代价是要借助工具生成一堆代理类,好多个人开发的框架都有这种弊病)
  • 通过方法表示运算 如.BigThan("Number",">10") 这样太复杂,可编程性差,容错性低
  • 直接SQL 这种会造成可编程性和容错性低

可以看出最好的方式当属Linq和Lambda了

更新

理想情况下,对象的哪个属性修改了,就更新到哪个数据库里,会有以下几种设计

  1. 在属性SET方法上做文章,以在值修改了知道是哪个属性被更改了,更新时按此进行判断
    代价:需要大批量修改SET方法或用模版生成(EF7好像已经解决这个问题了)
  2. 参过参数的形式赋值,缺点是不太智能,可编程性容错性不高
  3. 采用AOP消息代理拦截属性变动,这种效率太低,并且没法调试

性能,缓存

虽然现在很少看到WEB服务器CPU占用很高,但运行效率还是需要考虑,运行逻辑判断时间直接影响请求响应时间,在ORM框架

这个时间多消耗在类型与数据映射,要减少响应时间,需要对映射行为进行优化,减少不必要的计算

开发高效的应用程序少不了缓存的支持,数据不可能总是从数据库读取,也不总是非要进行关才才能获得数据

缓存创建,过期处理,和查找效率也需要进行考虑,像Nhibernate和Nbear必须先进行配置才能缓存,简值不能忍

CodeFirst Or DbFirst

上面也提到,EF7强制了CodeFirst模式,开发观念要发生改变了,先业务后数据,数据是基于业务实现得来的,理想情况下

有什么样的业务结构,就应该会有什么样的数据表结构,不应去管数据库是什么样的,由框架来处理就行了,比如自动映射,自动创建维护数据库

那种写完对象结构还得再配个XML数据表映射文件的形为,得拖出去枪毙10分钟

开发便捷性

好多框架需要用工具生成一堆代理类,增加属性/字段了,再生成一遍,这样便捷性很低,就像一辆赛车开跑前先得预热10分钟,很让人着急

泛类型问题:对数据进行操作时,有的必须带上泛类型,这样在开发时感觉带上了一个尾巴,很冗余,不方便

多种数据库/多库支持

多库支持不可避免,这意味着框架能按业务进行配置使用哪个库

在框架设计时基本会考虑多种数据库支持,如果是多种数据库多库...

以上仅为个人观点,不对的地方请指证

ORM之殇,我们需要什么样的ORM框架?的更多相关文章

  1. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

  2. Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点)

    Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点) 一丶Django的静态文件配置 #we ...

  3. CRL2.3(ORM开发框架)源码github发布

    简介 CRL是一个面向对象的轻便型ORM业务框架 此框架追求的是使用简单,方便,因此设计为: 不需要代码生成器生成对象类,按标准方式写即可 依托lambda,实现语法解析转换为等效的SQL查询,完全以 ...

  4. ORM框架示例及查询测试,上首页修改版(11种框架)

    继上次ORM之殇,我们需要什么样的ORM框架? 整理了11个ORM框架测试示例,通过示例代码和结果,能很容易了解各种框架的特性,优缺点,排名不分先后 EF PDF XCODE CRL NHiberna ...

  5. ORM查询语言(OQL)简介--高级篇(续):庐山真貌

    相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎换骨 ORM查询语言(OQL)简介--高级篇(续):庐山 ...

  6. ORM查询语言OQL

    ORM查询语言(OQL)简介--高级篇(续):庐山真貌 相关文章内容索引: ORM查询语言(OQL)简介--概念篇 ORM查询语言(OQL)简介--实例篇 ORM查询语言(OQL)简介--高级篇:脱胎 ...

  7. 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】

    前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...

  8. ORM是什么?如何理解ORM

    一.ORM简介         对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.简单的说,ORM是通过使 ...

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

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

随机推荐

  1. 记录一次Quartz2D学习(二)

    (一)内主要就是讲了线条的绘制以及绘制状态的保存与恢复 本次就讲一些图形的画法 2 图形的绘制 2.1  三角形的绘制 :(就是绘制三条线) - (void)drawRect:(CGRect)rect ...

  2. 在VMware上安装VMTools

    1. 什么是VMtools VM tools顾名思义就是Vmware的一组工具(关于如何在虚拟机上安装Linux,可以参考我之前的博文:http://www.cnblogs.com/libingbin ...

  3. iOS系列 基础篇 03 探究应用生命周期

    iOS系列 基础篇 03 探究应用生命周期 目录: 1. 非运行状态 - 应用启动场景 2. 点击Home键 - 应用退出场景 3. 挂起重新运行场景 4. 内存清除 - 应用终止场景 5. 结尾 本 ...

  4. [MySQL Reference Manual] 18 复制

    18 复制 18 复制 18.1 复制配置 18.1.1 基于Binary Log的数据库复制配置 18.1.2 配置基于Binary log的复制 18.1.2.1 设置复制master的配置 18 ...

  5. 使用ABP EntityFramework连接MySQL数据库

    ASP.NET Boilerplate(简称ABP)是在.Net平台下一个很流行的DDD框架,该框架已经为我们提供了大量的函数,非常方便与搭建企业应用. 关于这个框架的介绍我就不多说,有兴趣的可以参见 ...

  6. JSON-RPC 2.0 规范中文文档

    链接地址如下 http://wiki.geekdream.com/Specification/json-rpc_2.0.html

  7. c# float显示时保存一位小数

    UI显示时候,需求保留一位小数 //保留一位小数 参考: http://blog.sina.com.cn/s/blog_620531730100kfz6.html float ff = 1.01f; ...

  8. Linux下的串口编程及非阻塞模式

    本篇介绍了如何在linux系统下向串口发送数据.包括read的阻塞和非阻塞.以及select方法. 打开串口 在Linux系统下,打开串口是通过使用标准的文件打开函数操作的. #include < ...

  9. [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)

    Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...

  10. 关于JSONP

    一.JSONP的诞生 1.首先,因为AJAX无法跨域,其次开发者发现,<script>标签的src属性是可以跨域的. 2.把跨域服务器写成调用本地的函数,回调数据回来不就好了. 3.JSO ...