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

相关文章

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

小米中台建设实践 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 作为一个分布式的虚拟

Spring Framework系统框架

序号表示的是学习顺序 IoC(控制反转)/DI(依赖注入): ioc:思想上是控制反转,spring提供了一个容器,称为IOC容器,用它来充当IOC思想中的外部。 我的理解就是spring把这些对象集中管理,放在容器中,这个容器就叫Ioc这些对象统称为Bean 用对象的时候不用new,直接外部提供(bean) 当外部的对象有关系的时候,IOC给它俩绑好(DI) DI和IO

Sentinel 高可用流量管理框架

Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 Sentinel 具有以下特性: 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应

关键字synchronized、volatile的比较

关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简