写点什么

比较 NHibernate 和 Entity Framework

  • 2012-06-17
  • 本文字数:1879 字

    阅读完需:约 6 分钟

葡萄牙的一位开发者 Ricardo Peres 最近发布了一篇文章,以看起来无偏见的形式对领先的两种.NET ORM:NHibernate 和 Entity Framework 进行了比较。我们建议考虑使用这两种框架的人都应该读下他的文章, NHibernate 和 Entity Framework 之间的区别,另外还将指出一些关键的区别。

从架构上看,NHibernate 基于 Java 的 Hibernate ORM。 Ricardo 写道:

在 NHibernate 中,工作单元和配置项以及模型实例都相互独立。 你首先会创建 Configuration 对象,在其中你会指定所有 NHibernate 设置,像要使用的数据库和语言、批处理的大小、映射关系等等,然后你会依此构建 ISessionFactory。 ISessionFactory 会持有与特定数据库绑定的模型和元数据,以及来自于 Configuration 对象的设定,并且,一般每个进程中只有一个实例。 最终,你会基于 ISessionFactory 创建 ISession 的示例,它是工作单元(Unit of Work)以及标识符地图(Identity Map)的 NHibernate 表现形式。 这是一种轻量级的对象,它本质上会根据需要打开和关闭数据库连接,并跟踪与之相关的实体。 ISession 对象很容易创建和销毁,因为所有的模型复杂性都存储在 ISessionFactory 和 Configuration 对象中。

评论者 Morten Mertner 说:“我永远都不会使用 NHibernate。 尽管它拥有很棒的特性列表,但它并非一种能够轻松使用的产品,而且 API 和设计中始终带有遗传自 Java 的味道(同样,很多 Java API 都太企业化,并且架构过于庞大;结果会与你想要的大相径庭)。”

Entity Framework 遵循的是更加传统的.NET 设计,其中所有一切都封装在单独的 ObjectContext 或者 DbContext 中。 这让使用对象更加简单,但是缺点在于“类并没有因此是轻量级的,因为它有与 NHibernate 类似的内容,并且一般不会看到这样的例子:实例可以缓存在字段中。”

对于映射,NHibernate 和 Entity Framework 之间的关键区别在于,前者支持基于 XML 的映射文件,该文件可以独立部署。 在理论上,这让你可以针对不同的数据库 schema 使用相同的对象模型,而不需要重新编译应用程序。 但在实践中很少这么使用。

在很多方面古老一些的 NHibernate 要优于 Entity Framework。 Ricardo 提供了更多细节,并简要地总结如下:

  • 关联:都支持一对一、一对多、多对多,但是 NHibernate 还支持各种排序、未排序和索引的选项。它甚至还有不变的(immutable)、索引的(indexed)列表。
  • 缓存:NHibernate 提供了带有大量实现的二级缓存。Entity Framework 没有任何对此内建的支持,但是有些增加二级缓存的例子
  • ID 生成:NHibernate 提供了大概十二种策略,这取决于你如何计算。Entity Framework 只为 SQL Server 提供了主要的三种:标识符列、GUID、和手动赋值。
  • 事件:Entity Framework 只有两种基于事件的扩展点: ObjectMaterialized SavingChanges 。“NHibernate 拥有非常丰富的事件模型,暴露了超过 20 种事件,有些针对同步前执行(synchronous pre-execution),有些针对异步后执行(asynchronous post-execution)”。
  • 级联:“两种框架都支持集合和关联的级联:当实体被删除的时候,相关的子实体也会被删除。NHibernate 还提供了一种特性,可以把子实体上的外键设置为 NULL,而不删除它们。”
  • 清理变更:NHibernate 提供了一种自动模式,其中在必要的时候会保存变更,像“如果有一种实体类型的脏实例,而查询是针对这种实体类型执行”。 FlushMode.Auto 实际上是默认值,但偶尔会看到由于自动清除而导致性能问题

也有一些领域中,Entity Framework 会比 NHibernate 好,比方说:

  • 跟踪变更:尽管两种框架在工作单元级别默认都能够跟踪变化,而 Entity Framework 还提供了自我跟踪实体(self-tracking entities)
  • 整合:Entity Framework 当然会与 Visual Studio 和各种 ASP.NET 以及 WCF 类库有很好的绑定。
  • 文档:“这是另一种 Entity Framework 表现非常好的地方:NHibernate 缺少针对初学者的文档,并且也没有与其最新版本同步的最新 API 参考。”
  • 查询:Craig 写到:“NHibernate 有更丰富的特性,但有一个领域除外,那就是对 Linq 的支持。因为对于很多用户来说,Linq 或者其它查询语言都是 ORM 中最可见的部分,它会让人对功能产生错误印象。”

还有某些领域,两种框架都可以做出改进,像批处理功能。当需要真正支持 SQL 的高级特性——像通用表表达式——的时候,两种 ORM 框架都无法支持 SQL Alchemy

我们应该发现两个项目都很活跃,经常会有定期的改进。所以,如果二者都能够满足你的最小需求,那么考虑就更多集中在程序库的设计模式和哲学上,而不是在特性列表上。

查看英文原文: Comparing NHibernate and Entity Framework

2012-06-17 07:589411
用户头像

发布了 340 篇内容, 共 146.2 次阅读, 收获喜欢 13 次。

关注

评论

发布
暂无评论
发现更多内容

这些常用ETL任务调度框架组件,你都知道几个?

敏捷调度TASKCTL

大数据 kettle 海豚调度 调度引擎 调度式分布

万字长文聊缓存(下)- 应用级缓存

Silently9527

缓存 缓存击穿 Caffeine 缓存架构

架构师训练营 - 大作业二

Pudding

架构师训练营 - 第 13周课后作业(1 期)

Pudding

架构训练营 - 第12周课后作业 - 学习总结

Pudding

如果腾讯、阿里是弱生态,那么谁是强生态?

ToB行业头条

入职阿里!全靠刷明白了这份Java面试合集(分布式+Dubbo+线程+Redis+数据库+JVM+并发)

Java架构之路

Java 程序员 架构 面试 编程语言

小品阅读所带来乐趣

叶小鍵

Vue 3 组件开发:搭建基于SpreadJS的表格编辑系统(环境搭建)

葡萄城技术团队

Vue SpreadJS vite

滴普技术荟-云原生基座OpenKube开放容器实践(二):理解linux虚拟网络设备veth

Linux

三年JAVA开发经验,字节四面成功拿下2-2Offer,入职就是30K16薪

Java架构之路

Java 程序员 架构 面试 编程语言

亿级流量峰值没在怕,“缓存”技术来减压!

博文视点Broadview

同事临走时,给了我这份多线程and高并发(面试题+思维导图),借此我含泪拿下了阿里offer

Java架构之路

Java 程序员 架构 面试 编程语言

分布式身份:重新定义你的“身份”管理

华为云开发者联盟

区块链 数据 隐私保护 分布式身份标识

2020 — iOS 面试败北感悟

iOSer

ios 面试 iOS Document 底层知识

计算机专业必看!难道Android真的凉了?大厂内部资料

欢喜学安卓

android 程序员 面试 移动开发

抽象照进现实

型火🔥

抽象 视觉化

从根上理解高性能、高并发(三):深入操作系统,彻底理解I/O多路复用

JackJiang

网络编程 高并发 高性能 即时通讯

深圳区块链交易所开发、数字货币交易平台开发

W13902449729

深圳区块链交易所开发 数字货币交易平台开发

Java并发编程:AQS的公平性

李尚智

Java Java 分布式 java 并发

全网最全原理讲解!如何试出一个Android开发者真正的水平?已开源

欢喜学安卓

android 程序员 面试 移动开发

案例展示自定义C函数的实现过程

华为云开发者联盟

数据库 数据 C语言 字符串

anyRTC 2020年12月SDK更新

anyRTC开发者

uni-app android 音视频 WebRTC sdk

Appium的安装及简单的使用介绍

行者AI

人工智能

IT2.0:中台构建还应从企业业务实际出发

华为云开发者联盟

区块链 分布式 安全 数据 身份安全

滴普技术荟-云原生基座OpenKube开放容器实践(一):如何理解Linux network namespace ?

Linux

花了19998买的学习教程!2021年Android技术下半场在哪?震撼来袭免费下载!

欢喜学安卓

android 程序员 面试 移动开发

AI面临产业大考:落地虽难,但产业化路径已日渐清晰

脑极体

架构师训练营 - 大作业一

Pudding

Linux的进程pid编号极限

程序员架构进阶

Linux 进程

架构训练营 - 第 13 周课后作业 - 学习总结

Pudding

比较NHibernate和Entity Framework_语言 & 开发_Jonathan Allen_InfoQ精选文章