21

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

谢谢

编辑:

该项目将使用包含大量数据的大型现有表,还将使用在 SQL Server DB 中执行复杂任务的现有存储过程。ORM在运行现有存储过程和查询当前表时必须能够执行事务并具有高性能。该项目是基于 Web 的,将使用带有 DDD 的 WCF Web 服务。我可以看到 EF 更易于使用并且具有更大的支持,但如果 NH 是最合适的选择?

4

5 回答 5

10

实体框架不断实现新功能,并且您的项目中的一切都是自动化的。使用实体框架非常容易,扩展和重构您的代码。Visual Studio 像魅力一样集成了它(代码优先、数据库优先、实体优先……)。Windows Azure 使其易于部署和更改。此外,Visual Studio 可以在 3 次单击中生成所有 CRUD 页面。

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

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

编辑:

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

当您在 EntityFramework 中使用 Database-First 时,导入和使用存储过程非常容易,对于 NHibernate 来说也非常简单。请注意,如果您使用大量存储过程而不是大量同时使用的用户,那么在这两者之间选择 ORM 可能不是那么重要。

也不要忘记工具的性能通常取决于使用它的方式。如果您滥用 ORM(例如异步、延迟/急切加载、基类等),性能将急剧下降。

也许您可以同时安装它们,看看它们是如何工作的并检查它们的路线图(例如实体框架)以检查演变和兴趣。

于 2013-08-01T15:50:01.697 回答
10

查看这篇文章 NH 优于 EF 的一些优势

  1. NH有10+种id生成策略(IDENTITY、sequence、HiLo、manual、increment、几个GUID等),EF只有manual或者SQL Server的IDENTITY;
  2. NH 具有惰性属性支持(注意:不是实体,这是用于字符串、XML 等属性),EF 没有;
  3. NH 具有二级缓存支持(相信我,企业开发人员正在使用它)而 EF 没有;
  4. NH 支持具有“虚拟”属性的自定义类型,甚至是复杂类型,其中包括查询这些虚拟属性,而 EF 不支持;
  5. NH有公式属性,可以是任何SQL,EF没有;
  6. NH 有实体和集合的自动过滤器,EF 没有;
  7. NH 支持原始类型(字符串、整数等)以及组件(没有标识的复杂类型)的集合,EF 不支持;
  8. NH支持6种集合(list、set、bag、map、array、id数组),EF只支持一种;
  9. NH 包含一个代理生成器,可用于自定义生成的代理,EF 不允许这样做;
  10. NH 有 3 个映射选项(.HBM.XML,按代码,按属性),而 EF 只有两个(按属性,按代码);
  11. NH 允许查询和插入批处理(这是因为 EF 只真正支持 IDENTITY 键),EF 不支持;
  12. NH有几种乐观控制策略(db上的列,包括Oracle的ORA_ROWSCN、timestamp、integer version、all、dirty columns),EF只支持SQL Server的TIMESTAMP或all
于 2016-10-10T11:49:31.867 回答
7

两者都是很好的解决方案,尽管我个人认为 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 这样的 micro-orm。

编辑:

NHibernate 似乎也可以填充私有属性,所以这只是我的无知。

于 2013-08-27T19:18:45.120 回答
6

.NET 4.5 上的 EF 5 或 6是提高性能的一种可靠方法,不要指望 .NET 4.0 上的 EF 5 有任何速度改进,这是由 Microsoft 记录的。(我们还有另一个问题是 LINQ 语句写得不好)。

一般来说,如果性能是高优先级,则无法通过存储过程击败 ADO.NET。你根本做不到。添加了 ORM,添加和 IOC 容器...您要进行多少性能测试?

使用 JMETER 启动一些 VM,然后使用 EF 访问服务器并使用 NHibernate 访问另一个服务器,您只需强制 JMETER 对 URLS 进行足够的调用并测试并发用户的数量,您应该会看到瓶颈在哪里。

于 2013-11-21T17:39:38.187 回答
4

可能值得在这里补充一点,Entity Framework 在附加断开连接的图时存在问题,并且缺少 Nhibernate 中的合并等功能。您可以使用其他插件解决它,但不是开箱即用。这是 Codeplex 上要求更好地支持与断开连接的实体一起工作的功能的链接,还有一些进一步的讨论。

于 2014-04-04T11:00:16.593 回答