转自:http://developer.51cto.com/art/200811/76356.htm

2008-11-11 14:00 朱永光译 infoq 我要评论(0)

一个在ADO.NET实体框架(Entity Framework,EF)项目中的微软开发人员Danny Simmons,他最近发表了一个对实体框架和其他数据访问解决方案比较的博客帖子。在和传统的ADO.NET及LINQ to SQL比较之后,Danny又把实体框架和nHibernate进行比较,这就引起了其他开发人员的反对

一个在ADO.NET实体框架(Entity Framework,EF)项目中的微软开发人员Danny Simmons,他最近发表了一个对实体框架和其他数据访问解决方案比较的博客帖子。在和传统的ADO.NET及LINQ to SQL比较之后,Danny又把实体框架和nHibernate进行比较,这就引起了其他开发人员的反对。下面是Danny的帖子的摘录:

在EF和nHibernate之间最大的不同是,实体数据模型(Entity Data Model,EDM),以及我们基于这个东西构建的需要长久运行的数据平台。EF通过了特别的构造,将查询/形成结果的映射过程,与构建对象和变更跟踪分离开来。这种方式让创建概念模型变得更为容易,而概念模型使你可以考虑如何实现数据,以便随后能在其他很多包含了这些构建对象的服务中重用。长期以来,我们把EDM这样的思想融入到多个其他微软产品中,以至于假如你拥有一个实体数据模型,你可以基于这个模型自动创建面向REST的Web Service(ADO.NET Data Service,即Astoria);可以基于这个模型编写报表(Reporting Services);可以在服务器和脱机客户端存储库中同步数据,这些数据可以作为实体进行原子性地移动,就算这些实体是从服务器上的多个数据库表中抽取而来;可以从实体感知的构建部件中创建工作流;等等,等等……所以,所谓的不同点不是EF比Nhibernate能支持更复杂的映射功能或其他类似的东西,而是在于——EF不仅仅是一个ORM,它是在基于实体理念的数据平台中庞大愿景中的第一步。

作为回应,Frans Bouma,LLBLGen Pro的主创人员,一个微软MVP,在它的帖子中写到:

我不同意这种说法:一个像Danny Simmons这样工作于实体框架中如此久的人,这样的人怎么能忽略这样一个事实——任何O/R Mapper都是针对实体理念的。在他最后一句话中所描述的东西,实际上是一个单一目的的O/R Mapper:就是让开发人员能在OO语言中使用实体实例,并把这些实例保存到如关系数据库这样的非OO环境中,反之亦然。假如所有的东西就是抽象的实体模型和它的投射,那么更大的愿景是什么呢?也许工具?它让开发人员创建这些投射和在应用程序代码中调用O/R Mapper服务根据容易。

Jeremy D. Miller,一个.NET开发人员和构架师,在他的博客中说到Danny Simmons:

他在比较NHibernate和实体框架过程中遗漏了一个重要的事实。实体框架对你的应用程序具有很强的入侵性,而Nhibernate没有。NHibernate让我能使用POCO的方式来对业务过程进行建模而无需知晓数据库。而,实体框架却要我把EF的基础结构直接加入到我的业务对象中。

Danny Simmons提到的为其他目的(如报表)而使用EDM的好处,Greg Young——一个微软的MVP,在他的博客上对其进行了评论

一个单一的模型不可能适应你的应用程序里包括事务行为、搜索和报表在内的所有方面……可以举出很多这样的内容来。如果你基于你的事务模型来创建报表,那么你就会遇到麻烦!

Jimmy Bogard,一个Headspring Systems的高级顾问,也在他的博客中回应到:

我认为把数据模型共享给你边界外的任何人,是错误的(参看Evans,Domain-Driven Design)。把概念模型或EDM或其它我们以任何名字称呼它的东西共享出来也是错误的。

我从来不把域对象直接通过服务暴露出来。这是对我尽量创建的封装的一种侵害。

如果任何人想要一个SSRS【译者注:SQL Server Reporting Service】,那么我会给他们一个单独的报表数据库——为报表所需而定制的。我不希望报表的关注点影响了我们的事务关注点。一个映射层不能解决这样的问题,但类似SSIS【译者注:SQL Server Integration Service】这样的产品却可以。你想要报表?好,这里有你需要的只读视图,每小时、5分钟、每天或随时进行更新。

所以,现在的问题是:ADO.NET实体框架是否已经不仅仅是一个O/R Mapper了,以及它如何和nHibernate进行比较?很多人倾向于认为EF是一个简单的O/R Mapper,并认为它相对于nHibernate而言缺乏很多特性。另外一方面,Danny Simmons说微软刚刚开始开发EF,他们的计划是未来要超越当前的O/R映射功能。

[转] ADO.NET实体框架引发争论的更多相关文章

  1. Entity Framework 学习总结之一:ADO.NET 实体框架概述

    http://www.cnblogs.com/xlovey/archive/2011/01/03/1924800.html ADO.NET 实体框架概述 新版本中的 ADO.NET 以新实体框架为特色 ...

  2. ADO.NET实体框架Entity Framework模型-基于元数据解析

           上一篇简单介绍了EF的XML模型结构,在基于xml解析一文中,主要使用xml查询技术Xpath,XQuery来得到实体模型中相应信息的,由于这种方式在数据库庞大,表关系复杂的情况下,有诸 ...

  3. ADO.NET实体框架Entity Framework模型-基于XML解析

            最近由于项目需求,需要对实体框架内表之间的关系进行处理,主要功能要求是通过一表名,返回其在实体框架内的所有关系表.主外键及每个字段的属性.先简单描述我解决这个问题从开始到最后的分析实现 ...

  4. ADO.NET 实体框架 资料收集

    https://msdn.microsoft.com/en-us/data/aa937723.aspx https://msdn.microsoft.com/en-us/library/bb39957 ...

  5. ADO.NET EF实体框架

    ADO.NET 实体框架概述 随着.NET Framework 3.5 SP1和Visual Studio 2008 SP1的正式发布.ADO.NET 实体框架正式来到开发人员的面前,它使开发人员可以 ...

  6. 【ASP.NET Web API教程】2.3 与实体框架一起使用Web API

    原文:[ASP.NET Web API教程]2.3 与实体框架一起使用Web API 2.3 Using Web API with Entity Framework 2.3 与实体框架一起使用Web ...

  7. 未找到具有固定名称“System.Data.SQLite”的 ADO.NET 提供程序的实体框架提供程序

    用户代码未处理 System.InvalidOperationException   HResult=-2146233079   Message=未找到具有固定名称"System.Data. ...

  8. asp.net EF6.0中出现未找到具有固定名称“System.Data.SqlClient”的 ADO.NET提供程序的实体框架提供程序解决办法

    出现的错误信息如下所示: 指定的架构无效.错误:  DataModel.ssdl(2,2) : 错误 0152: 未找到具有固定名称“System.Data.SqlClient”的 ADO.NET 提 ...

  9. 无法为具有固定名称“MySql.Data.MySqlClient”的 ADO.NET 提供程序加载在应用程序配置文件中注册的实体框架提供程序类型“MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6”

    "System.InvalidOperationException"类型的未经处理的异常在 mscorlib.dll 中发生 其他信息: 无法为具有固定名称"MySql. ...

随机推荐

  1. javascript 数字字符串转为数字

    var a="111"; comsole.log(a);     //打印出来是个字符串类型 comsole.log(+a);   //打印出来是个数字类型 comsole.log ...

  2. winform Config文件操作

    using System;using System.Collections.Generic;using System.Text;using System.Xml;using System.Config ...

  3. [大牛翻译系列]Hadoop(20)附录A.10 压缩格式LZOP编译安装配置

    附录A.10 LZOP LZOP是一种压缩解码器,在MapReduce中可以支持可分块的压缩.第5章中有一节介绍了如何应用LZOP.在这一节中,将介绍如何编译LZOP,在集群做相应配置. A.10.1 ...

  4. [译]Redis大冒险

    原文:ALCA in Redis-land 一篇对使用Redis在NoSQL的世界中冒险之旅的总结. The legs of our journey 像每次出发一样,先对我们这次的旅程路线做个介绍: ...

  5. ubuntu 停在开机界面

    今天有解决了一个问题.我在win7虚拟机上装的64位的Ubuntu 12.04.忘了怎么个情况了,反正就是系统进不去了,停在了开机界面,5个点的那个. 解决方法如下: 开机的时候按住shift键,进入 ...

  6. js中的数组Array定义与sort方法使用示例

    Array的定义及sort方法使用示例 Array数组相当于java中的ArrayList  定义方法:  1:使用new Array(5  )创建数组 var ary = new Array(5): ...

  7. mac os去除去除.DS_Store文件--使用python和go(原创)

    .DS_Store (英文全称 Desktop Services Store)是一种由苹果公司的Mac OS X操作系统所创造的隐藏文件,目的在于存贮文件夹的自定义属性,例如文件们的图标位置或者是背景 ...

  8. 为什么C/C++语言使用指针

    这是参加面试时,面试官问的一道开放性题目. 问题是:为什么C/C++语言使用指针? 这个问题一问出来,直接被面试官秒杀了,面试官大神,你怎么不按套路出牌啊? 说好的malloc和new的区别呢?说好的 ...

  9. 51nod 计算N!的位数

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1130 对于这类问题:斯特林近似公式:     百度百科的证明:http: ...

  10. 高效开发Android App的10个建议(转)

    假如要Google Play上做一个最失败的案例,那最好的秘诀就是界面奇慢无比.耗电.耗内存.接下来就会得到用户的消极评论,最后名声也就臭了.即使你的应用设计精良.创意无限也没用. 耗 电或者内存占用 ...