对于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. Android 通过adb shell命令查看内存,CPU,启动时间,电量等信息

    1.  查看内存信息 1)查看所有内存信息 命令: dumpsys meminfo 例: C:\Users\laiyu>adb shell shell@android:/ $ dumpsys m ...

  2. 20169205实验四 Android程序设计

    20169205实验四 Android程序设计 实验内容及步骤 (一)第一个android studio项目 android studio与eclipse的传统安卓开发有一些不同之处 android ...

  3. StretchBlt函数和BitBlt函数的用法

    StretchBlt和BitBlt都用在双缓冲视图中,用来显示一幅图像 一.StretchBlt 函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩.也即是将内存中的 ...

  4. [leetcode] 11. Same Tree

    因为我刷题是难度不是按发布日期,所以就有可能遇到这种情况,比如这个... Given two binary trees, write a function to check if they are e ...

  5. 9.使用GetData,Children实现对ZNode的监控

    一. zookeeper中的watcher 1. exists :监控的是[znode]的CUD 的操作   2. getdata 的时候注册的watcher[U,D 监控]update delete ...

  6. LR中的迭代次数设置

    在参数化时,对于一次压力测试中均只能用一次的资源应该怎么参数化呢?就是说这些资源用了一次就不能在用了的. --参数化时,在select  next row选择unique,update value o ...

  7. 为已经存在的TFS团队项目配置SharePoint集成

    配置好TFS团队项目集合与SharePoint站点集的集成后,就可以在新建TFS团队项目时集成SharePoint站点,也可以为已经存在的团队项目配置SharePoint站点的集成,如下图:   Fi ...

  8. php 5.6 与之前版本不兼容中的数组属性定义辨析

    在php5.6官方文档的不兼容页(http://php.net/manual/zh/migration56.incompatible.php)中提到了几个与以前版本不兼容的情况,其中提到了为类定义数组 ...

  9. maven项目搜索依赖jar包顺序

    local_repo  >  settings_profile_repo  >  pom_profile_repo  >  pom_repositories  >  setti ...

  10. C# 使用dynamic类型来访问JObject对象

    dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便. 使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类 ...