在.NET Framework 4.0中,Linq2SQL与EF的比较。

21

这两个产品现在的情况如何?我似乎找不到任何关于VS2010/.net 4.0特别问题的信息。

在.net 3.5时代,大多数人认为当.net 4.0推出时,Linq2SQL将会消失,但它似乎仍然存在并且表现良好。

另一方面,EF 4.0似乎得到了显着的改进。

对于我来说,我的大部分工作都是小型到中型项目,并且公司很快就要从VS08迁移到VS10。我应该关注什么?或者说,我应该花时间学习EF4.0还是NHibernate更好呢?(但回到主题,我真的更感兴趣的是Linq2Sql-EF。)

最后,我目前正在使用entlib / unity,哪个框架更适合依赖/策略注入?

提前致谢。


我的下面的回答解答了你的问题吗?如果是,请将其选为正确答案。 - RPM1984
1
说实话,我不知道你的答案是否正确,但它确实给了我一些想法,比较这两个产品时应该看哪个方向。谢谢! - Sleeper Smith
6个回答

26
以下是Entity Framework (v4)更好的一些原因:

1 - L2SQL基本上已经过时了

2 - L2SQL不支持POCO映射,EF则支持。

3 - EF更加灵活(代码优先、模型优先、数据库优先)。L2SQL只有一个。

4 - EF支持SPROC->POCO映射

5 - EF具有Entity-SQL,允许您在必要时返回到经典的ADO.NET

6 - EF支持继承(TPT,TPH)

7 - EF与仓储模式和通过IQueryable进行延迟执行密切相关

8 - EF组件(ObjectSet,ObjectContext)易于模拟并允许DI

我想不出任何新项目使用L2SQL的理由。

有些人可能会说“好吧,L2SQL对于小项目来说很好,我可以拖放完成”。

好吧,您也可以使用EF4,如果您决定修改/增大项目,则长期而言将拥有更多的灵活性/支持。所以这不是借口。

希望对你有帮助。


10
L2SQL比EF更容易入门,不需要大量的学习曲线,而且满足大多数中小型项目的需求。这就是为什么人们选择L2S而不是EF。 - Erik Funkenbusch
5
我不同意。这似乎是“简单”的,是因为它没有很多功能。但是,在L2SQL和EF之间,将表格丢弃到模型上并对其进行编码的行为基本相同。 “添加新实体数据模型 - >从数据库生成 - >包括这些表”。完成。针对由EF生成的DC进行编码。对我来说,这非常简单。 - RPM1984
2
性能差异如何?当 EF 刚推出时,它非常慢。 - Sleeper Smith
2
我们在谈论的是EF4,而不是EF1。 - RPM1984
3
@Sleeper,不要相信你在互联网上阅读到的所有性能声明。编写针对您特定问题的代码并进行分析。过早的优化会导致失败。 - Craig Stuntz
显示剩余5条评论

17

在前面的回答和评论中(我都点了+1),还有以下两点需要补充:

a) 性能: L2S 运行时比 EF 更轻量级(因为只有一个层;EF 则涉及两个模型层以及它们之间的映射)。

EF 通常会生成比 L2S 更冗长的 TSQL,但大多数情况下这只会影响到查询性能分析时的可读性。 SQL 优化器大部分时间最终仍会生成相同的执行计划。然而,有些情况下查询可能会变得非常庞大和复杂,这可能会对性能产生影响。

L2S 在客户端优化查询方面也稍微好一些;它可以消除可以在客户端评估的 where 子句谓词,从而使数据库不必再关心这些谓词。这意味着 SQL Server 的优化器处理更少的工作,同时也降低了出现“糟糕”执行计划的风险。

b) L2S vs L2E: 当将普通 CLR 方法用于 LINQ 查询时,L2S 相对于 L2E 转换成 TSQL 的能力仍略优,特别是在 DateTime 和相关方法上。L2E 支持的功能与 L2S 大致相同,但是通过自己的 EntityFunctions 类完成:http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.aspx

我认为 L2S 和 EF 都是很好的选择,您可以根据自己的需求和代码的合理寿命选择其中一个。您可能还没注意到,微软每 3-5 年就会宣布另一种数据访问技术。DAO、RDO、ODBC、ADO、OLEDB、ADO.NET、类型化数据集、ObjectSpaces、WinFS、L2S、EF 等等。我 15 年前写的针对 DAO 的代码仍然存在于市场上的应用程序中,尽管 DAO 已经“死”了多年,但它仍然能够正常工作。

有时会为全新的数据访问技术重新使用名称,但这并不改变微软最新的数据库访问技术是一个不断变化的目标的事实...


4

L2S并没有被淘汰。VS团队已经明确表示,它不会得到重大改进,但仍然会存在并且可以正常使用。

L2S很棒,对于数据模型相对简单的小型项目来说非常易用。我在何时选择EF而不是L2S的判断标准是:当我有多对多表格或需要映射更复杂的实体到不止一个表格时。


4
我知道这可能对原始查询来说太晚了,但为了那些有类似问题的未来人们着想...
在我看来,关键是你是在做全新的项目还是使用遗留数据库。我正在使用一个遗留数据库,其中一些设计决策相当奇特。我想使用EF,但它无法映射这些奇特之处,而L2S则可以很好地处理。
例如,一些外键包含与相关行的键不同的其他值-有效地成为FK /标志列的两倍。
此外,FK继承映射完全失败了,因此我选择了一个平面的L2S模型,以在查询时获得类型检查和名称检查的好处,但最终还是要建立自己的映射层。
如果这能让微软感到安慰的话,所有这些都是非常痛苦的。根据我的经验,在实际应用中,太多的数据库都存在这种问题,因此我的建议是,EF并不适合棕色场开发。
对于新项目,您有幸可以根据框架的假设来演化您的数据库设计。由于现有应用程序依赖于数据设计,我无法这样做。我们希望逐步改善设计,但试图在前期纠正所有问题将导致一个难以实现的大规模迁移事件(对于我们的资源而言)。
注意:至少在英国,棕色场开发是在先前开发过的土地上建房子。绿色场开发是在我们日益减少的乡村资源上建设。我在这里重复使用了这些术语。

3

我们刚刚从VS 2008迁移到了VS 2010,并且从L2S转向了EF。

尽管我们使用EF的方式与L2S非常相似,但让我感到舒适的是,如果需要,我有灵活性来执行更高级的ORM操作。

话虽如此 - 对于小型项目 - 我可能仍然会使用L2S。对于中型到大型项目,我会使用EF。

另外 - EF似乎是一个很大的学习曲线,因为EF文档提示我们开始研究一些设计模式,如Unit Of Work、Repository、Dependency Injection。然而,我意识到这些模式也适用于L2S。

就NHibernate而言 - 我的研究(即浏览SO)表明,EF4.0的最新版本已足够先进(支持POCO等)可以被视为竞争产品。


1
如果第三方產品對您有用,請嘗試使用LinqConnect。此產品允許您使用Linq to SQL(經過一些修改)與不同的DBMS(Oracle、MySQL、PostgreSQL等)。
LinqConnect提供了以下在L2S之前無法使用的功能:
  • 模型優先方法
  • TPT和TPH支持
  • POCO支持
  • 自動同步模型和數據庫,無數據損失。
就性能而言,最新的OrmBattle比較測試顯示我們的供應商是領先者之一。
此外,我們的特定於DBMS的提供商也支持所有EF功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接