Nhibernate 实体框架的成功案例?

Nhibernate 实体框架的成功案例?,nhibernate,entity-framework,orm,Nhibernate,Entity Framework,Orm,因此,像我之前的许多开发人员一样,我正处于选择一种ORM的十字路口,以便彻底学习并为未来的项目继续前进。我一直在玩实体框架,到目前为止,就像我看到的一样,尽管我只尝试过简单的事情,CRUD具有明确定义的表关系和1-1表实体映射。 我在实体框架上做了一些谷歌搜索,发现大部分是负面反馈。。。我最担心的是映射xml和生成的对象类的复杂性。。。以及它们依赖于EF的组件类这一事实,因此在涉及到对象模型设计时需要考虑到这一点。现在我倾向于NHibernate。。。因为映射文件相对简单,而且它可以与我制作的P

因此,像我之前的许多开发人员一样,我正处于选择一种ORM的十字路口,以便彻底学习并为未来的项目继续前进。我一直在玩实体框架,到目前为止,就像我看到的一样,尽管我只尝试过简单的事情,CRUD具有明确定义的表关系和1-1表实体映射。 我在实体框架上做了一些谷歌搜索,发现大部分是负面反馈。。。我最担心的是映射xml和生成的对象类的复杂性。。。以及它们依赖于EF的组件类这一事实,因此在涉及到对象模型设计时需要考虑到这一点。现在我倾向于NHibernate。。。因为映射文件相对简单,而且它可以与我制作的POCO对象一起工作,以满足我的对象模型设计需要。它甚至有一个LINQ提供程序,以及第三方代码生成工具。 然而。。。我现在还不想把EF扔出窗外。有人知道用EF编写的成功制作应用程序吗?或者在技术方面,我现在想倾向于EF的任何原因,例如有公司支持,是新的,因此随着时间的推移,当NH达到成熟度平衡时,功能集更有可能增长? 我不是想在这里挑起一场色彩战,我只是想在我做出决定之前,人们可能需要对EF添加一些积极的东西


谢谢

这类问题的问题在于,人们对框架的选择中有“宗教”的成分,ORM激发了很多热情

因此,冒着某些火焰的风险…我个人不是实体框架的狂热爱好者,我可以看到,在哪里使用遗留系统和ER模型并将其映射是非常好的,但我认为从长远来看(以及我的用例)更多地是围绕域模型设计构建的,并且我的实体将映射到该领域。这里有一个我倾向于同意的好方法


我想我喜欢像NHibernate这样的产品所采取的方法。目前我正在用一个真正的OODBMS(而不是ORM)进行实验,到目前为止我印象非常深刻。

虽然我倾向于同意Tim关于框架选择的“宗教”元素,但我仍然觉得有点奇怪,这么多人在他们显然没有费心去了解EF的工作原理的情况下,却愿意评论EF。事实证明,EF将是NHibernate的一个糟糕版本,就像锤子制造糟糕的螺丝刀一样。重要的是要了解EF本身的条款

在我讨论这里的评论中提出的一些问题之前,我要补充一点,我们刚刚发布了一个生产web应用程序的第2版,其中包含0行SQL和100%通过EF或ASP.NET成员API对客户进行的所有DB访问。我在这里讲的是使用EF的实际经验,遗憾的是,对于我迄今为止看到的大多数关于EF的评论的作者来说,这显然是不正确的

一般来说,我认为扩展实体类型是错误的。Tim引用的博客文章的作者(1)不知道这是可能的,(2)认为这是实现DDD的途径,这告诉了我我需要知道的关于他的真实EF体验的一切:他没有任何经验

POCO支持对于某些ORM的用户来说是一件非常重要的事情,因为他们已经很多年没有功能性LINQ实现了。由于您基本上只能处理从黑盒子中出来的任何类型的对象,因此控制父类型就成了一件非常重要的事情。事实上,写你的“POCO”是如此之大,以至于每个成员都宣称
public virtual
开始被视为没什么大不了的。这是哪颗行星上的“普通”类型?这是一个代理库,不是POCO。所谓的“POCO”根本不是POCO。只是他们更愿意在封装和性能上妥协,而不是在父类型上妥协。在他们的工具集的限制下,这可能是一个合理的妥协,但没有什么值得骄傲的

但EF的工作方式不同;通过LINQ投影实现任意类型与实际映射的类型一样容易。如果您正在构建通过线路发送对象而不是内部使用的对象,并且必须具有不依赖EF的客户端,那么您可以使用RIA服务或编写ADO.NET数据服务。所有的艰苦工作都会为你完成。EF是一系列工具的基础,这些工具处理将DB中的数据投影到各种类型的客户端的问题,而不是一个单独的工具,它试图在一个fat框架中处理应用程序内部可能需要的每一个数据转换。让EF处理从RDBMS到对象空间的投影。然后,您可以使用LINQ to实体来投影到持久性类型,或者使用RIA服务来投影到Silverlight友好的wire格式。要求一个工具来处理任何应用程序可能需要的每一个投影都是在乞求被这个工具困在一个贫民区


EF基于“值对象”的概念。这些类型具有属性,但没有行为。事实证明,对于某些特定的问题,值对象工作得非常好,比如通过电线发送数据,或者坐在RDBMS和OO编程之间的“无人地带”理解关注点的分离很重要:实体类型的要点是将RDB数据放入对象空间。然后,您可以编写实现应用程序的业务类型,并将实体类型投影到业务类型上。然后,您就可以自由地实现您的业务类型,而不必为持久性做出任何妥协。您可以在需要时更改RDB模式。您只需更改实体映射和BO预测,而不是BO本身。

我们在InterWorks使用NHibernate已有4年了。这对我们来说非常有效,我们已经在它的基础上建立了另一层