2009-10-28 164 views
108

很多人已经在网络上讨论过Entity Framework的第一个版本(同样在stackoverflow上),很明显,当我们已经有了更好的选择,比如NHibernate时,它不是一个好选择。但我找不到实体框架4和NHibernate的比较。我们可以说今天NHibernate是所有.NET ORM中的领导者,但我们可以期望Entity Framework 4从这个位置取代NHibernate。我认为,如果微软真的在EF4中注入了非常好的功能,它可以给NHibernate带来很好的竞争力,因为它具有Visual Studio集成功能,更易于使用,并且在大多数商店中始终给予MS产品优先选择权。实体框架4 vs NHibernate

+30

我想要更新这个比较。自09年以来发生了多少事? – Phil 2011-09-07 08:05:33

回答

62

在“自我追踪实体”中,EF4对于n层开发提供了一个现成的答案。没有人发布可比的NHib代码。

NHib具有很多功能,这些功能都没有被提及为EF4的一部分。这些包括二级缓存集成。它在继承映射方面具有更大的灵活性,与存储过程/数据库函数/自定义SQL /触发器的更好集成,对公式属性的支持等等。 IMO基本上只是作为ORM更成熟。

+12

+1)你说的对,NH已经成熟了,EF会赶上今年年底,4.0版本已经进入了一个戏剧性的入口,给它一些时间,并且在2011年中期将会是防弹的。 – 2010-01-18 07:57:05

+15

-1对于“EF4有一个关于n-tier的开箱即用答案发展,在“自我跟踪的实体”中,没有人发布可比较的NHib代码,“在NHibernate中有ISession.Merge,这对于N-Tier开发的自我跟踪实体有很多好处,原因很多。 – 2011-01-18 05:10:29

+12

@Alex - In NHibernate是一种“开箱即用”的解决方案,只是为了澄清; [“开箱即用”](http://en.wikipedia.org/wiki/Out_of_the_box)意味着它可以与Visual Studio。这是一个不合理的-1。 – 2011-02-22 12:17:06

10

我认为EF 4将有能力使用POCO和延迟延迟加载的事实将是非常大的事实。我可以肯定地看到它在新版本中获得牵引力。

+7

不要忘记LINQ支持。 NHibernate仍然不擅长它。 – 2009-10-28 23:35:49

+1

@Arnis,你能提供任何链接来支持这个观点吗? – 2009-10-29 09:36:05

+2

@Michael当你通过Ayande关于这个主题的博客文章时,这显而易见。目前,LINQ to NH基于标准API。标准API不允许HQL可以执行的一些更复杂的查询功能。 LINQ到NH的下一个版本将使用HQL而不是标准API。 – zowens 2009-10-29 17:42:03

24

这是事情。在我看来,NHibernate和实体框架真的适用于两种不同的受众。 NHibernate将是我构建一个具有复杂映射,公式和约束的系统(基本上任何企业)的选择。如果我想通过简单的数据访问来运行,我会使用实体框架或LINQ-to-SQL。与EF相比,NHibernate没有明确的“拖放”体验。两者都有其优点和缺点。坦率地说,比较他们的苹果,苹果,让你无处可去。

+13

你有没有试过ActiveWriter?实体框架绝对针对企业空间。我不同意你说的大部分内容。 – 2009-10-29 09:34:42

+1

不同意所有你想要的,但NHibernate已经存在的时间更长的事实是企业不会忽略的。 – zowens 2009-10-29 17:37:27

+1

什么是ActiveWriter,我从来没有听说过这个? – 2009-10-29 18:22:13

4

我的2美分:我们在桌面客户端上使用ef来进行一些cahing等 - 没有高负载。 服务器端的NHib - 利用无状态会话,hilo id生成和批处理。 以每秒db的速度插入3k +消息的速度非常快。它也非常灵活,支持很多dbs,这对我们的产品至关重要。

22

如果你认为你可能曾经想要运行在Mono代码,NHibernate的可能是一个更好的选择,无论是功能清单说什么......

编辑,2012年8月13日:

实体框架已经开源,现在包含在2.11.3版本的Mono中。现在这个答案已经过时,不应该依赖。

http://weblogs.asp.net/scottgu/archive/2012/07/19/entity-framework-and-open-source.aspx

+0

事实上,从http://www.mono-project.com/Compatibility看到“EntityFrameworks - Not available。”,看起来没有人有兴趣实现它。所以至少几年来,这是NHibernate或什么都没有。 – user276648 2011-04-29 10:48:01

36

更新:我自4.0版本没有使用实体框架,所以我的答案可能是过时的。我仍然在我的项目中使用NH或纯ADO .NET。自从4.0以来,我甚至不想看看EF的新功能,因为NH完美地工作。

实际上很容易比较它们,当你使用两者。有与EF4一些严重的限制,我可以说出一些我遇到我的自我:

EF4问题:

  • 预先加载和塑造的结果:EF4渴望装载系统(包括(“路径“))会产生不正确的SQL,并带有循环JOIN,这会对多对多关系执行数千次(而不是字面上的)时间,然后手写SQL(它实际上无法使用)。
  • 物化器无法实现关联的实体:如果您认为可以通过提供自己的SQL查询来克服以前的问题,那么您就错了。 EF4无法从JOIN SQL查询实现(映射)关联实体,它只能从一个表中加载数据(因此,如果您有Order.Product,则SELECT * FROM order LEFT JOIN Product将仅初始化Order对象,Product将保留为null,认为在查询中获取所有必要的数据以初始化它)。这可以通过使用EFExtensions社区插件来克服,但您必须为此编写的代码非常难看(我尝试过)。
  • 自我跟踪实体:许多人认为自我跟踪实体对于N层开发很酷,包括本主题中的顶级答案。以为我甚至没有给他们一个尝试,我可以说他们不是。每个输入都可以伪造,你不能简单地将用户发送给你的改变应用到数据库,为什么不给用户直接数据基地访问呢?任何你将不得不加载数据的用户都将从数据库中进行更改,检查它是否存在|不存在执行权限检查等等。你无法相信用户对他发送给服务器的实体的状态,反正必须从数据库加载这个实体并确定它的状态和其他事情,因此这些信息是无用的,自我跟踪实体也是如此,除非您为内部使用建立私有的可信的n层系统,在这种情况下,您可能只是简单地数据库访问。 (这就是我对ST实体和N-轮胎的想法,我不是很在N层expericned,所以它可以改变,如果我误解的东西在这里评论吧)

  • 记录,活动,整合的商业逻辑: EF4就像是黑盒子,它做了一些事情,你不知道它做了什么。只有一个事件OnSavingChanges,您可以在DB发生某些事情之前放置一些您需要运行的业务逻辑,并且如果您在发生某些事情之前需要对业务对象进行一些更改,则必须在ObjectStateManager中进行挖掘,这真的很难看,代码可能会变得巨大。例如,如果您使用Repository模式以及以干净对象的方式对DB进行的更改进行通知,您将很难用EF做这件事。

  • 可扩展性:所有EF代码是私有的,内部的,如果你不喜欢的东西(你会不会想了很多,如果你是认真的EF使用),没有办法,你将简单的方式改变这种实际上,我确信从头开始编写自己的ORM(我做过)会很容易,然后根据需要让EF工作。举例来看EFExtensions源代码,它基于扩展方法,以及不同的“黑客”来使EF更有用,代​​码非常难看(而且这不是作者的错误,当EF中的所有内容都是私有的,这是唯一的方式来扩展它)。

我可以继续写关于EF的不好的事情,以及对于我来说这是多么痛苦的20页,也许我会。

NHibernate怎么样?这是完全不同的级别,它就像比较PHP和C#,EF4就像在Stone-age中一样,这就像EF在开发过程中比NHibernate落后了10年,事实上,Hibernate是在2001年开始的。如果你有空有时间学习并打开Nhibernate,就这样做。

+1

这是EF3,4,4.1吗? – 2011-08-08 09:47:57

+1

EF已经在Apache 2许可下发布,这应该有助于扩展性。 – CMircea 2012-08-01 08:48:19

+0

@MirceaChirea这是个好消息,我没有想到,现在浏览EF源代码,非常有趣的阅读。 – 2012-08-01 18:15:48

12

我认为这是因为EF4.0自1.0以来已经走过了很长的一段路,并且正在赶上Nhibernate的功能,但它还不是全部。

但是,它是开箱即用的微软,它完成了95%的应用程序所需要的功能。但是,NHibernate多年来一直在做同样的事情。到5.0或6.0版本可能赶上,甚至超过NHibernate。

这是我的建议 - 如果你有时间去学习,那就去做吧。有几个理由选择一个。如果你正在为一家公司编写代码,期望能够熟练使用EF的员工是现实的,因为它是所有书籍和孩子在大学学习的内容。如果EF能够满足你的要求(在说出是的话之前想想这个很长很难),那么现在它是一个完美的解决方案,并且在几年内它可能(很可能会超越NHibernate)。

NHibernate是一个非常成熟的产品,几年在EF上,很可能会做你想做的一切,然后一些。一段时间以来,它一直是最好的ORM,很多人都使用它。

+0

很好的答案。+1 – nawfal 2013-07-22 10:42:28

3

用逻辑层的Linq组合直接映射到存储过程似乎是最简单的方法。没有xml。仅为不常用或不适用于存储过程的有趣查询生成sql。

对象通过标准SP加载和存储。这种方法允许使用两个SQL登录名。一个用于通过SP(仅执行权限)访问类,另一个用于允许直接访问表的逻辑LINQ模块。

5

有一个明显的trend增加EF热门NHibernate,看到图片。

NHibernate vs Entity Framework

+0

你的答案是什么? https://yourlogicalfallacyis.com/bandwagon – 2016-04-14 08:53:41

+0

根据这一趋势,人们开始越来越多地使用Google的EntityFramework。他们可能有很好的理由。也许开始变得更好。 – qub1n 2016-04-14 13:40:47

+0

这可能是这种情况,它也可能是MS正在被默认使用的内容。另外EF的工具非常好。 – 2016-04-14 14:45:53

1

人气ORM的之间进行选择是不是做的最好的事情。 我已经尝试过过去2年转向EF,我只能说,为什么我仍然尝试着呢?

ATM我对EF的观点是:“它是为小型非常小的系统制造的,不超过3个表,关系少于1(0更好)”。

为什么我会那样想? 1.尝试更新未连接的图形并查看模型划痕;

  1. 尽量让TPH深继承树,你会发现你,你是schackled到一个层次或系统将打破。

  2. 试着做出更麻烦的查询,并观察整个系统吃掉堆栈:D ...溢出发生的频率很高。

  3. 映射XML数据类型基于扩展或最讨厌的NotMapped属性......它更糟糕。

  4. 尝试将SQL查询混合到Linq以获取更多finner查询,并且您将打破墙上的大声笑。而且最后也是最重要的一点是,EF不支持属性公式('对于遗留数据库来说NH是一个很棒的资源'),并且不支持同一表和相关表的复杂类型映射。

这是我的10cc。