现在,.NET v3.5 SP1已经发布(与VS2008 SP1一起发布),我们现在可以访问.NET实体框架。

我的问题是这个。当试图决定使用实体框架和LINQ to SQL作为ORM时,有什么区别?

按照我的理解,实体框架(当与LINQ to Entities一起使用时)是LINQ to SQL的“大哥”?如果是这样的话,它有什么好处?LINQ to SQL不能单独做什么?


当前回答

LINQ to SQL真的死了吗?Jonathan Allen为InfoQ.com撰写

马特·沃伦(Matt Warren)将[LINQ to SQL]描述为“根本就不应该存在”的东西。从本质上讲,在真正的ORM准备就绪之前,它只是应该帮助他们开发LINQ。...实体框架的规模导致它错过了.NET 3.5/VVisual Studio 2008的最后期限。它及时完成了不幸命名为“.NET 3.5 Service Pack 1”,它更像是一个主要版本,而不是一个Service Pack。...由于复杂性,开发人员不喜欢[ADO.NET实体框架]。...从.NET 4.0开始,LINQ to Entities将是LINQ to关系场景的推荐数据访问解决方案。

其他回答

两者都不支持唯一的SQL 2008数据类型。与我的观点不同的是,Entity仍然有机会在未来的某个版本中围绕我的地理数据类型构建模型,而Linq to SQL被放弃,永远不会。

不知道nHibernate或OpenAccess有什么问题。。。

我在实体框架方面的经验并不出色。首先,您必须从EF基类继承,所以向POCO说再见。你的设计必须围绕EF。使用LinqtoSQL,我可以使用现有的业务对象。此外,没有延迟加载,您必须自己实现。有一些变通方法可以使用POCO和延迟加载,但它们存在IMHO,因为EF还没有准备好。我计划在4.0后重新开始

我发现在使用EF时,我不能在同一个数据库模型中使用多个数据库。但在linq2sql中,我只需在模式名称前面加上数据库名称即可。

这是我最初开始使用linq2sql的原因之一。我不知道EF是否已经允许这一功能,但我记得读到它的初衷是不允许这一点。

在@lars发布的文章中,有许多明显的区别,但简短的回答是:

L2S是紧密耦合的-对象属性到数据库的特定字段,或者更正确地将对象映射到特定数据库模式L2S仅适用于SQL Server(据我所知)EF允许将单个类映射到多个表EF将处理M-M关系EF将能够针对任何ADO.NET数据提供程序

最初的前提是L2S用于快速开发,EF用于更多的“企业级”n层应用程序,但这使L2S的销售有点不足。

这里的答案涵盖了Linq2Sql和EF之间的许多差异,但有一个关键点没有得到太多关注:Linq2Sql只支持SQL Server,而EF为以下RDBMS提供了提供程序:

由Microsoft提供:

用于SQL Server、OBDC和OLE DB的ADO.NET驱动程序

通过第三方提供商:

MySQL数据库神谕分布式数据库维斯塔数据库数据库PostgreSQLInformix公司U2型Sybase公司Synergex公司火鸟Npgsql语言

举几个例子。

这使得EF成为关系数据存储的强大编程抽象,这意味着无论底层数据存储如何,开发人员都可以使用一致的编程模型。这在开发产品时非常有用,您希望确保产品能够与广泛的通用RDBMS互操作。

这种抽象有用的另一种情况是,您是一个开发团队的一部分,该团队与许多不同的客户或组织内的不同业务部门合作,您希望通过减少他们必须熟悉的RDBMS的数量来提高开发人员的生产力,以便在不同的RDBMS之上支持一系列不同的应用程序。