Entity framework 实体框架与NHibernate-性能

Entity framework 实体框架与NHibernate-性能,entity-framework,nhibernate,Entity Framework,Nhibernate,我希望在我们的系统中实现ORM。我们目前有许多表,其中包含大量可怕的数据和存储过程。我听说使用ORM会降低系统速度。有人知道使用C代码中创建的查询和映射到存储过程哪个ORM在速度和性能上更好吗 谢谢 编辑: 该项目将使用现有的大型表和包含大量数据的表,还将使用现有的存储过程在SQL Server数据库中执行复杂任务。ORM必须能够执行事务,并且在运行现有存储过程和查询当前表时具有高性能。该项目基于web,将使用WCF web服务和DDD。我可以看出EF更易于使用,并有更大的支持,但如果NH是最合

我希望在我们的系统中实现ORM。我们目前有许多表,其中包含大量可怕的数据和存储过程。我听说使用ORM会降低系统速度。有人知道使用C代码中创建的查询和映射到存储过程哪个ORM在速度和性能上更好吗

谢谢

编辑:


该项目将使用现有的大型表和包含大量数据的表,还将使用现有的存储过程在SQL Server数据库中执行复杂任务。ORM必须能够执行事务,并且在运行现有存储过程和查询当前表时具有高性能。该项目基于web,将使用WCF web服务和DDD。我可以看出EF更易于使用,并有更大的支持,但如果NH是最合适的选项,Entity Framework将不断实施新功能,并且您的项目中的所有内容都是自动化的。使用实体框架、扩展和重构代码非常容易。 VisualStudio将其集成(代码优先、数据库优先、实体优先……)就像一个魅力。 WindowsAzure使部署和更改变得更加容易。 此外,VisualStudio可以在3次单击中生成所有CRUD页面

我建议您使用EF,但这取决于您的项目。你能告诉我们更多的细节吗

你可以在谷歌上找到很多比较图表,比如解释性能和差异

编辑:

您能量化应用程序中的用户数量吗

当您首先在EntityFramework中使用数据库时,它非常容易,因为NHibernate也是如此。 请注意,如果您使用了大量存储过程而不是大量同时使用的用户,那么在这两者之间选择ORM可能就不是那么重要了

另外,别忘了工具的性能通常取决于使用它的方式。如果误用ORM(例如异步、延迟/急切加载、基类等),性能将急剧下降


也许你可以安装它们,看看它们是如何工作的,并查看它们的路线图(例如)来检查它们的发展和兴趣。

两者都是很好的解决方案,尽管我个人认为NHibernate更适合继承数据库

在NHibernate中有一些明显更好的功能,比如二级缓存支持。文档可能比EF少一些,但是如果你愿意经历学习过程,NHibernate会给你更多的能力

FluentNHibernate非常适合将类类型化映射到底层表,但在某些地方,您只需恢复到XML映射即可。然而,NHibernate本身有一个新的竞争API,我还没有检查过(上面的博客文章提到了它)

如果您想依靠VS工具支持,EF更好。然而,有时会有一些魔力(例如,EF甚至可以使用反射来填充对象的私有属性,NHibernate不会这样做;这是一个优势还是劣势,取决于您如何看待它)。EF还可以与Microsoft提供的其他框架(例如RIA服务)配合使用。我还喜欢EF自动迁移(当您首先使用代码时)

如果您希望掌握更多的权力,并且希望能够通过清晰的关注点分离(ORM只做ORM应该做的事情)来微调事情的工作方式,那么NH似乎更好。然而,让NH能够访问所有的虚拟属性有点恼人

我已经使用了这两种方法,有时生成所需的sql时,这两种方法都会有点笨拙;在5-10%的情况下,再降低一级,使用像Dapper、Massive或Petapoco这样的微型orm

编辑:


NHibernate似乎也可以填充私有财产,所以这只是我的无知

在.NET 4.5上使用EF 5或EF 6是提高性能的一种可靠方法,不要期望在.NET 4.0上使用EF 5会有任何速度提升。Microsoft对此进行了记录。(我们还有另一个问题,LINQ语句写得很差)

一般来说,如果性能是高优先级的,那么在存储过程方面就无法打败ADO.NET。你根本不能。添加了ORM、添加和IOC容器。。。您希望进行多少性能测试


用JMETER启动几个虚拟机,用EF攻击一个服务器,用NHibernate攻击另一个服务器,您只需强制JMETER对URL进行足够的调用,并测试并发用户的数量,您就可以看到瓶颈所在。

在此值得补充的是,实体框架在附加断开连接的图形时存在问题,并且缺少诸如Nhibernate中的合并等功能。你可以用其他插件来解决这个问题,但不能开箱即用。下面是对Codeplex上的功能的一个补充,该功能要求更好地支持处理断开连接的实体,并且还有一些进一步的讨论。

NH比EF的一些优点

  • NH有10+id生成器策略(标识、序列、HiLo、手动、增量、多个GUID等),EF只有手动或SQL Server的标识
  • NH有惰性属性支持(注意:不是实体,这是用于字符串、XML等属性),EF没有
  • NH有二级缓存支持(相信我,企业开发人员正在使用它),而EF没有
  • NH支持自定义类型,甚至复杂的“虚拟”属性,包括查询这些虚拟属性,EF不支持
  • NH有公式属性,可以是任何SQL,EF没有
  • NH有实体和集合的自动过滤器,EF没有
  • NH支持基本类型(字符串、整数等)和组件(没有标识的复杂类型)的集合,EF不支持
  • NH支持6种集合(列表、集合、包、地图、数组、id数组),EF只支持一种
  • NH包括一个代理生成器,可用于自定义生成的代理,EF不允许这样做
  • 新罕布什尔州