对于ORM,公司一直在用轻量级的PetaPoco,PetaPoco是挺轻巧,易用性和性能都非常优秀。但也有很多的缺点,在组装复杂sql语句的时候有bug,记忆中使用orderby、sum的时候经常会有问题;特殊情况下数据库链接有问题:具体问题记不清了,后来同事修改源代码解决了这个问题;本身不支持linq,不过github上有人提供了linq的支持;功能少,没有内置使用缓存,虽然公司自己实现了一套对Runtime和Memche的封装的框架,但并没有封装的很强大,写数据访问层的代码时,还是需要手工通过CacheKey操作缓存。
 
    按照目前的应用场景,显然PetaPoco太轻了,相对于NH、EF,我们需要做很多额外的工作,增加了开发成本,于是就考虑换一款ORM。在.net平台上,想换个强大的,基本就是NH和EF二者择其一了。于是从网上找了许多从各方面对比二者的资料。
 
    从开发团队的活跃度来看,www.ohloh.net上的图表一目了然,基本相似,但EF有上升的趋势,而NH就不如EF(参考:NHibernate-http://www.ohloh.net/p/nhibernate ;EF-http://www.ohloh.net/p/entityframework );从开发者的讨论上看,NHibernate在11年之前很多,而之后大部分都是EF的声音,这个主要参考了stackoverflow、codeproject、infoq、博客园等。
 
    EF6很多新的功能,这也使得它更加的强大,但NHibernate可能是出现的比较早,这些功能早已经有了。在功能上的对比,这篇文章比较客观http://www.devbridge.com/articles/entity-framework-6-vs-nhibernate-4/ EF6有一点让我不大爽:本身没有提供二级缓存,虽然很有多热心的网友提出了第三方的解决方案,但要用于生产环境还是需要推敲,我貌似又没有这么多的时间去做这件事。而且,EF早就已经在这里讨论过二级缓存的必要性了,但直到现在也没有提供这项功能的迹象。
 
    还有二者性能上的对比,ORMBattle给出了比较详细的数据(不过是针对老版本的,不知道为什么一直没有更新),假行僧对ORMBattle进行了改进(EF4 vs NH3)。从这些数据上看,EF和NH在性能上应该是伯仲之间,就算把两者都提升到最新的版本,我想也是差不多的,而且实际应用中会针对具体情况优化代码,所以就没在亲自写代码测试......。好吧,我承认我有点懒。
 
    之前对这两款ORM都略有接触,觉得学习的成本NH要大些,有些概念需要理解,提供的工具不如EF。
 
    使用NHibernate的典型开源项目有:Orchard。使用EF的有:NuGetGallary。
 
    从上面的情况来看,两个都很不多,从情感上我更喜欢EF,但二级缓存是个问题。从实际情况上看,NH更适合,但又担心它的前途。思前想后,抛了几次硬币,还是用NHibernate吧,至少它是更适合现在的需求的。技术在发展,至于以后会不会再换成EF,who knows,其他的orm也说不定,只要保证Repository层的扩展性就好了。

一次简单的ORM调研的更多相关文章

  1. 一个简单的ORM制作(SQL帮助类)

    一个简单的ORM制作大概需要以下几个类: SQL执行类 CURD操作类 其他酱油类 先从SQL执行类说起,可能会涉及数据库的迁移等问题,所以需要定义一个接口以方便迁移到其他数据库, 事务没提供命名,若 ...

  2. D2010 RTTI + Attribute 简单实现ORM

    还记得David I 今年四月来盛大时,被问及“反射机制能再做得好一点吗?我们想放弃RTTI”,David I 回答“这的确是需要考虑的地方,当然RTTI我们不会放弃的”.(这个白胡子的老哥哥还真很可 ...

  3. C#基础笔记---浅谈XML读取以及简单的ORM实现

    背景: 在开发ASP.NETMVC4 项目中,虽然web.config配置满足了大部分需求,不过对于某些特定业务,我们有时候需要添加新的配置文件来记录配置信息,那么XML文件配置无疑是我们选择的一个方 ...

  4. C#基础---浅谈XML读取以及简单的ORM实现

    背景: 在开发ASP.NETMVC4 项目中,虽然web.config配置满足了大部分需求,不过对于某些特定业务,我们有时候需要添加新的配置文件来记录配置信息,那么XML文件配置无疑是我们选择的一个方 ...

  5. 实现简单的ORM

    介绍 本篇将介绍实现简单的ORM,即:对数据表的通用操作:增.删.改.查 数据访问层 数据访问层类图 类说明: 1.DbProvider(供应):为数据操作提供基本对象,如:连接.操作对象.事务... ...

  6. metadata的使用以及简单的orm模式

    使用sqllite3和metadata简单的封装了个简单的orm #!/usr/bim/python #-*-coding: utf-8 -*- import threading import sql ...

  7. Delphi2010 RTTI + Attribute 简单实现ORM实例

    1.支持ORM,最基础的两个信息是表的信息和字段信息.这两个信息,如果用Attribute 来辅助,代码更简洁和可读性更好.可以把属性名当做真实字段名,也可以将特性里的属性当成真实姓名,再加上字段标题 ...

  8. 通过反射来手写简单的ORM SQlserver

    不说废话,直接上干货,如发现问题,欢迎大家指出,谢谢! //------------------------------------MySQlServerORM [简单 CURD] using Sys ...

  9. 简单理解ORM,实体类生成查询SQL语句

    目前有很多开源的ORM项目,大多情况下也不需要我们重复去造轮子,我们只需要了解轮子怎么造的,怎么用就可以,下面简单说一下怎么通过实体生成一个SQL语句: 先建立2个Attribute类,TableAt ...

随机推荐

  1. cannot be cast to

    java.lang.ClassCastException: com.service.impl.OrderPlanServiceImpl cannot be cast to com.provider.s ...

  2. 整理悬浮在列表中a元素时改变a元素上下边框颜色的问题。

    整理一下当悬浮在a元素上时a的上下边颜色改变,并且里面的内容不会移动,下面是PSD图效果区域: 刚开始我先给A元素加了上下边框和颜色,利用a:hover改变a元素上下的边框颜色,但是第一个a元素的下边 ...

  3. UVa 1395 Slim Span (最小生成树)

    题意:给定n个结点的图,求最大边的权值减去最小边的权值最小的生成树. 析:这个和最小生成树差不多,从小到大枚举左端点,对于每一个左端点,再枚举右端点,不断更新最小值.挺简单的一个题. #include ...

  4. 检查路径是否存在与创建指定路径(mfc)

    检查路径是否存在 if (access("D:\\Work\\Encryption\\DES", 0)) 为真,则路径不存在 创建指定路径 system("md D:\\ ...

  5. CString->char*.,char*->CString,char*->LPCTSTR

    CString->char* CString strSource;//宣告CString char* charSource; //宣告char* 法1: charSource = (char*) ...

  6. QPS的计算

    QPS = req/sec = 请求数/秒 Q:如何根据日志查看一个服务的qps A: 一般access.log是记录请求的日志,tail  -f XXX.access.log ,可发现格式如下: 前 ...

  7. sql--CONVERT、FOR XML PATH解决实际问题

    需求:每个平台分类下的门店,每个门店的名称.图片路径.评分,每个门店下的四个产品的名称.图片路径.评分 思路: 一开始门店动态化好写,用Ajax就行了.但是每个门店下面的产品,每个去请求一次查询有点不 ...

  8. bash shell & 环境变量

    root是没有~/.bashrc的,只. /etc/profile即可,/etc/profile和~/.bashrc的作用类似,只是作用域不同,都是写死的export,也有动态的脚本去设置命令和环境变 ...

  9. Lambda 表达式浅谈- 01

    已经有一段时间没有发布博文了... 今天就写一写lambda的一些简单的使用方法 Lambda 在Msdn 上的描述: Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 ...

  10. 修改 Cloud image 的密码的简单方法

    下载工具: yum -y install libguestfs-tools.noarch   打开DEBUG: export LIBGUESTFS_DEBUG=1 LIBGUESTFS_TRACE=1 ...