NHibernate和实体框架比较

2024-02-04 17:08

本文主要是介绍NHibernate和实体框架比较,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

从架构上看,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都太企业化,并且架构过于庞大;结果会与你想要的大相径庭)。”

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

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

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

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

也有一些领域中,实体框架会比NHibernate,比方说:

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

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

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

NHibernate下载地址:NHibernate

这篇关于NHibernate和实体框架比较的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/678233

相关文章

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

对postgresql日期和时间的比较

《对postgresql日期和时间的比较》文章介绍了在数据库中处理日期和时间类型时的一些注意事项,包括如何将字符串转换为日期或时间类型,以及在比较时自动转换的情况,作者建议在使用数据库时,根据具体情况... 目录PostgreSQL日期和时间比较DB里保存到时分秒,需要和年月日比较db里存储date或者ti

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

数据治理框架-ISO数据治理标准

引言 "数据治理"并不是一个新的概念,国内外有很多组织专注于数据治理理论和实践的研究。目前国际上,主要的数据治理框架有ISO数据治理标准、GDI数据治理框架、DAMA数据治理管理框架等。 ISO数据治理标准 改标准阐述了数据治理的标准、基本原则和数据治理模型,是一套完整的数据治理方法论。 ISO/IEC 38505标准的数据治理方法论的核心内容如下: 数据治理的目标:促进组织高效、合理地

ZooKeeper 中的 Curator 框架解析

Apache ZooKeeper 是一个为分布式应用提供一致性服务的软件。它提供了诸如配置管理、分布式同步、组服务等功能。在使用 ZooKeeper 时,Curator 是一个非常流行的客户端库,它简化了 ZooKeeper 的使用,提供了高级的抽象和丰富的工具。本文将详细介绍 Curator 框架,包括它的设计哲学、核心组件以及如何使用 Curator 来简化 ZooKeeper 的操作。 1

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟