实体框架2和NHibernate如何比较?

实体框架2和NHibernate如何比较?,nhibernate,entity-framework,ado.net,Nhibernate,Entity Framework,Ado.net,我基本上想知道一些事情,比如: 两者之间的优势/劣势 两个框架之间的相似性/差异 它们在架构上有何相似/不同之处 使用每个模板需要多少样板代码 与NHibernate相比,实体框架能否在Visual Studio之外有效地使用?与Visual Studio一起使用时,实体框架是否比NHibernate更高效 注意:这个问题指的是实体框架2(目前仍在开发中)。免责声明:这篇文章基于我目前对实体框架下一个版本的了解。这可能是不准确的,或者在下一个版本真正放松之前可能会改变 一般方法: 实体框架(

我基本上想知道一些事情,比如:

  • 两者之间的优势/劣势
  • 两个框架之间的相似性/差异
  • 它们在架构上有何相似/不同之处
  • 使用每个模板需要多少样板代码
  • 与NHibernate相比,实体框架能否在Visual Studio之外有效地使用?与Visual Studio一起使用时,实体框架是否比NHibernate更高效
注意:这个问题指的是实体框架2(目前仍在开发中)。免责声明:这篇文章基于我目前对实体框架下一个版本的了解。这可能是不准确的,或者在下一个版本真正放松之前可能会改变

一般方法:

实体框架(EF)的主要方法是使用其图形设计工具创建实体数据模型,并从该模型生成域类和映射。也有人支持其他方法,但这种工作方式可能永远是主要的

NHibernate(NH)是一种基于文本的工具,如果您不使用第三方软件生成代码(如MyGeneration of CodeSmith)或其他配置支持约定(如Fluent NHibernate),则需要用户手动编写所有域类和映射

代码生成:

代码生成是标准EF使用的一个主要部分,可以使用图形设计器工具,也可以使用命令行工具。GUI和命令行工具的可用性是一个加号,因为它使EF易于入门,并允许更高级的使用,例如在构建过程中可以自动化

NHibernate不支持代码生成,除了模式生成(如果您想将其算作代码生成)之外。但是,如果您使用第三方软件,则可以生成代码

数据库架构生成:

EF将通过允许用户从实体数据模型生成模式,增加对模型优先开发的支持。NHibernate已经支持模式生成很长时间了。这里的区别在于如何创建“模型”,如前所述

LINQ:

EF将从v1开始改进其古怪的LINQ实现,NH现在已经达到了LINQ到NH的1.0版本,因此在这方面,两者之间应该没有任何重大差异

POCO:

EF将为域驱动设计方法和使用与数据访问层分离的域类提供更好的支持。然而,由于POCO不是EF的主要用例,我真的看不出他们的POCO支持如何达到NHibernate的水平。EF中的POCO支持还很年轻,对我来说,如果你是POCO/DDD的支持者,并且你发现自己出于某种原因在EF上工作,这更像是一种奖励

整个NHibernate框架是由DDD人员为POCO开发而构建的,他们已经达到了2.1版,并且充分利用了Java端Hibernate的所有工作。在相当长的一段时间内,NHibernate可能仍然是DDD/POCO/ALT.NET用户的首选

延迟加载:

EF的下一个版本将包括对自动延迟加载的支持。长期以来,自动延迟加载一直是NHibernate的重要组成部分

学习曲线:

这两个框架都非常复杂和强大,因此需要很长时间才能掌握。但是EF对初学者非常友好,因为它集成到VisualStudio中,带有图形设计工具,而且它可以为您生成很多东西,而无需您了解框架的任何内容。然而,如果您想深入了解EF并真正了解框架,您应该准备花费大量时间使用它


NHibernate有一个臭名昭著的学习曲线,但最近的一些改进使其有所减少。现在LINQ到NH的版本是v1.0,对于新到NH的开发人员来说,查询语法将更容易理解,Fluent NHibernate项目正在改善映射体验,甚至正在进行自动映射,这一点越来越好。

这在很大程度上是一个很好的答案(+1),但我不同意LINQ。虽然可以在没有LINQ的情况下使用EF,但我不知道有谁真的这么做过。在英孚,你将生活和呼吸林克。在NH,Oto,大多数用户不使用LINQ,而新发布的LINQ to NH非常有限(在工程中有一个限制较少且完全独立的实现)。此外,EF是围绕持久性/传输的价值对象(包括ORM和数据服务方面)的思想构建的,而NH是一种更“传统”的ORM。