我希望在我们的系统中实现ORM。我们目前有很多表,有很多可怕的数据和存储过程。我听说使用ORM会降低系统速度。有没有人知道哪个ORM使用在C#代码中创建的查询和映射到存储过程的速度和性能更好?
由于
编辑:
项目将使用大型且包含大量数据的现有表,它还将使用在SQL Server DB中执行复杂任务的现有存储过程。在运行现有存储过程和查询当前表时,ORM必须能够执行事务并具有高性能。该项目是基于Web的,将使用带有DDD的WCF Web服务。我可以看到EF更容易使用并且有更大的支持,但如果NH是最合适的选择吗?
答案 0 :(得分:10)
实体框架不断实施新功能,一切都在您的项目中实现自动化。使用Entity Framework非常容易,扩展和重构代码。 Visual Studio将它集成在一起(Code-First,Database-first,Entity-First ......)就像魅力一样。 Windows Azure易于部署和更改。 此外,Visual Studio可以通过3次点击生成所有CRUD页面。
我建议您使用EF,但这取决于您的项目。你能告诉我们更多关于它的细节吗?
您可以在Google上找到许多比较图表,例如this one解释性能和this one差异。
编辑:
您能否量化应用程序中的用户数量?
当您在EntityFramework中使用Database-First时,import and use stored procedures非常容易,对于NHibernate也是quite simple。 请注意,如果您使用大量存储过程而不是大量并发用户,那么在这两者之间选择ORM可能并不那么重要。
另外不要忘记工具的性能通常是基于使用它的方式。如果你滥用ORM(例如异步,懒惰/急切加载,基类......),性能将大幅下降。
也许你可以安装它们,看看它们是如何工作的,并检查它们的路线图(例如Entity framework)以检查它们的演变和兴趣。
答案 1 :(得分:6)
两者都是很好的解决方案,尽管我个人认为NHibernate对于继承的数据库更好。这是一个很好的功能比较 -
http://www.dennisdoomen.net/2013/03/entity-framework-56-vs-nhibernate-3.html
在NHibernate中有一些明显更好的东西,比如二级缓存支持。文档可能比EF更稀疏,但如果你愿意经历学习曲线,NHibernate会给你更多的力量。
FluentNHibernate非常适合类到基础表的类型映射,但有些地方你只需要恢复为XML映射。然而,有一个新的竞争API来自NHibernate本身,我还没有检查过它(上面的博客文章提到它)。
如果您想依赖VS工具支持,EF会更好。然而,有时候会有一些魔法(例如,EF可以使用反射甚至填充对象的私有属性,NHibernate不这样做;这是一种力量或弱点,取决于你如何看待它)。 EF也适用于其他Microsoft提供的框架(例如RIA服务)。我也喜欢EF-auto迁移(当你使用代码优先时)。
如果你想要掌握更多权力,并希望能够通过明确的关注点分离(ORM只做ORM应该做的事情)微调事情的方式,那么NH似乎更好。然而,让NH的所有属性都能够访问它们有点令人恼火。
我已经使用了两者,有时可能会有点笨拙地生成你想要的sql;在那些5-10%的情况下,再下降一个级别并使用像Dapper,Massive或Petapoco这样的微观。
编辑:
NHibernate也可以填充私人财产,看起来,所以这只是我的无知。
答案 2 :(得分:6)
.NET 4.5上的EF 5或6 是提高性能的一种可靠方法,不要指望在.NET 4.0上使用EF 5可以提高速度,这是Microsoft记录的。 (我们还有另一个问题,那就是写得不好的LINQ语句)。
通常,如果性能是高优先级,则无法使用存储过程击败ADO.NET。你根本做不到。添加了ORM,添加和IOC容器...您想要做多少性能测试?
使用JMETER启动一些虚拟机并使用EF命中服务器并使用NHibernate命中另一个虚拟机,您只需强制JMETER对URL进行足够的调用并测试并发用户数量,您应该看到您的瓶颈所在。
答案 3 :(得分:5)
check this artical NH超过EF的一些优点
答案 4 :(得分:3)
这里可能值得添加,实体框架在附加断开连接的图形时会出现问题,并且缺少Nhibernate中的合并等功能。你可以用其他插件解决它,但不是开箱即用。以下是Codeplex上的功能link,要求更好地支持使用断开连接的实体,还有一些进一步的讨论。