entity framework4与NHibernate

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

在“自我跟踪实体”中,EF4对于n层发展有一个开箱即用的答案。 没有人发布可比编码的NHib。

NHib有许多function,都没有被提到是EF4的一部分。 这些包括二级caching集成。 它在inheritance映射方面具有更大的灵活性,与存储过程/数据库函数/自定义SQL /触发器的更好集成,对公式属性的支持等等。 国际海事组织基本上只是作为一个ORM更成熟。

更新:我从4.0版本开始就没有使用entity framework,所以我的答案可能已经过时了。 我仍然在我的项目中使用NH或纯ADO .NET。 自从4.0以来,我甚至不想看看EF的新function,因为NH完美地工作。

事实上,当你使用两者的时候,比较它们非常容易。 EF4有一些严重的限制,我可以列举一些我自己遇到的情况:

EF4问题:

  • Eager加载并修改结果 :EF4加载系统(Include(“Path”))产生不正确的SQL,循环joinJOIN,对于多对多关系执行数千次(而不是字面上的)时间,然后手写SQL有效无法使用)。
  • 物化器无法实现关联的实体 :如果您认为可以通过提供自己的SQL查询来克服以前的问题,那么您就错了。 EF4不能从JOIN SQL查询实现(映射)关联实体,它只能从一个表中加载数据(所以如果你有Order.Product,SELECT * FROM命令LEFT JOIN Product将只初始化Order对象,Product将保持为null,认为所有必要的数据在查询中被提取以初始化它)。 这可以通过使用EFExtensions社区插件来克服,但是你必须为此编写的代码真的很难看(我试过)。
  • 自我追踪实体 :许多人认为自我追踪实体对于N层开发是很酷的,包括本主题中的最佳答案。 以为我还没有给他们一个尝试,我可以说他们不是。每个input都可以伪造,你不能简单地把用户发送给你的改变应用到数据库,为什么不给用户直接的数据基地访问呢? 任何方式你将不得不加载数据用户即将从数据库中更改,检查它存在|不存在做权限检查等等等等你不能相信用户对他正在发送到服务器的实体的状态,反正必须从数据库加载这个实体,并确定它的状态和其他的东西,所以这个信息是无用的,自我跟踪实体,除非你做一个私人的可信的n层系统内部使用,在这种情况下,也许你可以给数据库访问。 (这是我关于ST实体和N轮胎的想法,我在N-Tier中没有很好的体会,所以如果我误解了这里的评论,它可能会改变)

  • logging,事件,集成业务逻辑: 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,做到这一点。

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

如果你觉得你可能想要在单声道上运行你的代码,NHibernate可能是一个更好的select,不pipe什么function清单说…

编辑,2012年8月13日:

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

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

我认为EF4.0自1.0以来已经走过了很长的一段路,在function上已经赶上了Nhibernate,但目前还不是全部。

不过,它是微软公司的现成产品,95%的应用程序需要它做100%的工作。 然而,NHibernate多年来一直在做同样的事情。 到5.0或6.0版本可能赶上,甚至超过NHibernate。

这里是我的build议 – 如果你有时间去学习,那就去做吧。 有几个理由select一个在另一个之上。 如果你正在为一家公司编写代码,那么希望能够熟悉EF的员工,比如所有的书籍和孩子们在大学里学习的东西都是现实的。 如果EF能够满足你的要求,那么现在就是一个很好的解决scheme,在几年之内,它可能(很可能会超越NHibernate)。

对于EF来说,NHibernate是一个非常成熟的产品,很可能会做你想做的所有事情,然后做一些事情。 一段时间以来,它一直是最好的ORM,很多人使用它。

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

有一个明显的趋势 ,比NHibernate增加EF的普及,看到图片。

NHibernate与实体框架

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

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

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

selectORM之间的stream行是不是最好的事情。 过去的2年里,我试图转移到EF,我只能说,为什么我仍然尝试着呢?

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

我为什么这样想? 1.尝试更新断开连接的graphics并查看模型划痕;

  1. 尝试使用深层遗传树来制作TPH,并且您会发现您已经被绑定到单个层次结构,否则系统将会中断。

  2. 尝试做出更多麻烦的查询,并观察整个系统吃掉堆栈:D …溢出经常发生。

  3. 地图的XML数据types是基于扩展或最“恨”的NotMapped属性…而且更糟糕。

  4. 尝试混合SQL查询到Linq的更多finner查询,你会打破墙上的笑声。

  5. 最后也是最重要的是,EF不支持属性公式(NH对于遗留数据库有一个很棒的资源),并且不支持同一个表和相关表的复杂types映射。

这是我的10cc。