对于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的声音,这个主要参考了*、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层的扩展性就好了。