飞天发布时刻:2024年 Forrester 公有云平台Wave™评估报告解读 了解详情
写点什么

比较 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:588999
用户头像

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

关注

评论

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

故障处理 | DM 搭建 MySQL 8.0 同步链路报错:code=26005

TiDB 社区干货传送门

安装 & 部署 TiDB 源码解读

离线部署系列文章之二:TiDB集群升级(5.3.0->5.4.2)&缩扩容 TiDB Server、PD、TiKV、TiFlash

TiDB 社区干货传送门

版本升级 集群管理 管理与运维 安装 & 部署

字节一面:HTTPS 一定安全可靠吗?

程序员小毕

Java 程序员 面试 https 校招

20万字的《Kafka运维实战宝典》PDF现在免费下载了

石臻臻的杂货铺

大数据 kafka

【8.12-8.19】写作社区精彩技术博文回顾

InfoQ写作社区官方

优质创作周报

Meta项目功能测试 | 开启PrestoDB和Aria扫描优化

Alluxio

hive presto Alluxio 大数据 开源 8月月更

7 天能找到 Go 工作吗?学学 Go 数组和指针试试

梦想橡皮擦

Python 爬虫 8月月更

TiDB 和 Java 的简单 CRUD 应用程序

TiDB 社区干货传送门

SAP ABAP 和 Java 里的弱引用(WeakReference)和软引用(SoftReference)

汪子熙

Java 引用 SAP abap 8月月更

开源一夏 | 在 STM32L051 上使用 RT-Thread (四、无线温湿度传感器 之 串口通讯)

矜辰所致

开源 RT-Thread 8月月更 STM32L051

一文带你认知定时消息发布RocketMQ

华为云开发者联盟

云计算 后端

九章云极DataCanvas公司与中国信通院完成可信AI基础软件战略合作

九章云极DataCanvas

人工智能 数据智能 数智化 可信AI

当内卷风波及代码领域,看Alluxio将会采取怎样的块分配策略

Alluxio

腾讯 存储 Alluxio block 8月月更

修筑产学研用一体化的通衢,从一场比赛背后瞭望苏州园区人才培养新范式

脑极体

ABAP 一组关键字 IS BOUND, IS NOT INITIAL 和 IS ASSIGNED 的用法辨析

汪子熙

指针 应用 SAP abap 8月月更

马拉车算法 (最长回文串 例题 密码截获)

Five

算法 8月月更

OpenHarmony有氧拳击之设备端开发

OpenHarmony开发者

OpenHarmony

手把手教你实现 TiFlash 向量化函数丨十分钟成为 TiFlash Contributor

TiDB 社区干货传送门

离线部署系列文章之一:TiDBv5.3.0集群部署&源码部署 Haproxy v2.5.0

TiDB 社区干货传送门

实践案例 版本升级 管理与运维 安装 & 部署 扩/缩容

打了15天,如何做到在容器权限上不失一分?

青藤云安全

容器安全 攻防演练

Web3.0 DAPP项目智能合约系统开发技术详情

开发微hkkf5566

优雅,永不过时!SpringBoot中这样编写Controller层代码,那叫一个完美

Java永远的神

Java 程序员 面试 程序人生 springboot

高效完成需求计划的四个关键 | 敏捷开发

LigaAI

Scrum 敏捷开发 Sprint LigaAI spring event

前半个月的行动中,整个圈子都在疯传的“内网King”到底是个啥?

青藤云安全

网络安全 主机安全 攻防演练

TiDB 和 Golang 的简单 CRUD 应用程序

TiDB 社区干货传送门

Python图像处理丨基于OpenCV和像素处理的图像灰度化处理

华为云开发者联盟

Python 人工智能 图像

如何在 TiDB Cloud 上使用 Databricks 进行数据分析 | TiDB Cloud 使用指南

TiDB 社区干货传送门

如何避免数据湖变成数据沼泽

Kyligence

数据湖 数据管理 智能多维数据库

如何在企业数字化团队内部实现数据分析建模成果的结构化整合沉淀

ModelWhale

工作流 数字化转型 数字化 案例分享 提高效率

云图说丨初识可信分布式身份服务

华为云开发者联盟

云计算 安全 后端

5分钟,带你看完24岁60W年薪架构师的简历,上面竟然写着精通JVM

收到请回复

Java JVM java面试 简历模板 金九银十

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