实体框架4与NHibernate

.net entity-framework nhibernate orm

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

一般承认的答案

EF4在“自我跟踪实体”中有关于n层开发的开箱即用的答案。没人发布NHib的可比代码。

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


热门答案

更新:我从4.0版开始就没有使用Entity Framework,所以我的回答可能已经过时了。我仍然在我的项目中使用NH或纯ADO .NET。我甚至不想看看自4.0以来EF中的新功能,因为NH工作得很好。

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

EF4问题:

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

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




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因