.net 实体框架与 LinqToSql 相比如何?
Posted
技术标签:
【中文标题】.net 实体框架与 LinqToSql 相比如何?【英文标题】:How is the .net Entity Framework overkill versus LinqToSql? 【发布时间】:2010-09-21 00:12:09 【问题描述】:我听说实体框架比 LinqToSql 有点矫枉过正或者难学。
我想知道以什么方式?我使用了 LinqToSql 并喜欢它。所以,我正在尝试 EF,而对于我正在做的事情,它们看起来几乎完全相同。命名空间和方法名称不同,但到目前为止,我没有看到任何使 EF 比 LinqToSql 更难的东西。
我敢肯定,如果我开始做更复杂的事情,它会变得更复杂。但话又说回来,我可能根本无法用 LinqToSql 做同样的事情,所以我认为这是 EF 的一个加分项,以防万一我确实想做更复杂的事情。
EF 使用的资源是否比 LinqToSql 多,以至于如果我只需要类似 LinqToSql 的功能,我就不应该使用它?
更新: 我做了一些测试,我的测试似乎表明 Linq to Entities 的性能优于 Linq to SQL。
我首先从单个表中删除 1000 条记录,添加 1000 条记录,编辑 1000 条记录,然后将它们数据绑定到 DataView。 LinqToSQL:5 秒 LinqToEntities:2 秒
我使用两个连接表执行了相同的测试,结果相似。
我的测试似乎支持另一个帖子: Linq To Sql vs Entity Framework Performance
更新 2:
感谢您的回复。在我看来,与 Linq to SQL 相比,Linq to Entities 并没有真正矫枉过正。在研究了更多之后,我认为使用 Linq to Entity 是要走的路。它似乎有更好的性能。
我相信我听到的“矫枉过正”的说法是因为 Linq to Entities 可以比 Linq To SQL 做更多的事情,而且它确实需要更多的配置(web.config 中大约多 1 行)。此外,Linq to Entities 所做的一些小事情与 Linq to SQL 不同,这可能会让人们觉得 Linq to Entities 更复杂。但是一旦你学会了如何做事,Linq to Entities 似乎并不比 Linq to SQL 复杂。
【问题讨论】:
【参考方案1】:如果我错了,请纠正我,但实体框架应该只在您需要转换后端对象时发挥作用,例如当您组合来自不同数据源的表、拆分表等时。它添加实体层,这样你就可以隐藏所有的管道,只处理你清理过的实体。如果您只是像在 LINQ to SQL 中那样对表使用 1 对 1,那么我确信您不使用的复杂层会减慢它的速度。听起来 LINQ to SQL 是适合您的工作的正确工具,除非您有更复杂的数据源需求。
【讨论】:
【参考方案2】:Linq to SQL 和实体框架在概念上是不同的野兽,您应该根据它们如何满足您的需求而不是微基准来做出选择。即使实体框架速度较慢,但它是微软 ADO.NET 团队的重点,并将多次改进。 Linq-to-SQL 被有效冻结。
从概念上讲,它们的不同之处在于 Linq-to-SQL 只是一种使用 Linq 执行数据库查询的方式。听起来很明显,但重点是:您正在访问根据其数据库模型结构化的数据。尽管 FK 被适当地转换,但您仍然有多余的对象,其中数据被规范化到不同的表中。您编写的每个查询都必须处理这种情况。
Entity Framework 允许您以声明方式构建一个层,该层以应在内存中表示的方式表示您的数据,将来自多个表的数据带到适当的单个对象中;将多对多关系表示为集合属性等。然后您编写的查询将针对此模型,并且目的更清晰,更明显(不再有 15 个表连接!)。
如果您不确定是否使用 Entity Framework,O'Reilly 将于 2009 年 1 月 15 日出版 Entity Framework 的综合书籍(预览版现已在 Roughcuts 上提供) - 它的 MSDN 文档目前非常糟糕,这使得提出建议它更难。我确实相信它值得长期用于除了最琐碎的项目之外的所有项目(就我个人而言,如果我正在写一些琐碎的东西,我会直接使用 ADO.NET2 而忘记 Linq)。
【讨论】:
【参考方案3】:不过要小心,如果您使用带有分组依据的查询,LinqToEntities 可以做一些非常有趣的事情。我从来没有设法让 LinqToEntities 将 group by 转换为实际的 SQL group by,而是生成一些非常无效的大量代码块。
例如,查看以下链接: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/bb72fae4-0709-48f2-8f85-31d0b6a85f68
如果您尝试编写“重要”查询,ObjectQuery.ToTraceString() 是您最好的朋友,可以确保 EF 不会在您背后做一些非常愚蠢的事情。
【讨论】:
【参考方案4】:我的回答:对执行简单的获取/编辑/更新序列所需的时间做一个简单的比较。我想你会发现 LINQ to SQL 的速度是原来的两倍。在调查差异时,我做了一个快速比较项目。 结果: 实体框架 8,700 毫秒 LINQ to SQL 3,100 毫秒 数据集 2,000 毫秒
所以对我来说这是一个简单的问题。使用 DataSets 或使用 Linq-Sql - Entity Framework 甚至没有考虑到它!
link text
【讨论】:
我终于有时间做一个测试,但我却以相反的方式感到惊讶。我不知道我的测试是否有效,但我首先删除 1000 条记录,添加 1000 条记录,编辑 1000 条记录,然后将它们数据绑定到 DataView。 LinqToSQL:5 秒 LinqToEntities:2 秒 数据集?呃……还有很多其他的框架(例如,Subsonic、NHibernate 等)。更不用说我仍然经常喜欢的定制开发。我从来没有遇到过使用我认为甚至是远程干净的数据集的项目。 除了性能测试之外,你还应该看看你需要多少时间和精力才能让任何框架做你想做的事情。正如 senfo 所指出的,DataSet 可能很快,但使用起来并不是那么好。【参考方案5】:在深入了解 Linq To SQL 之前,请查看其项目经理的 this article。他提出了一个直截了当的问题“LINQ to SQL 死了吗?”答案并不那么简单。这绝对不是“不”。在我看来更像是“可能”。
我建议您在深入研究 EF(现在称为 Linq To Entities)之前认真考虑 NHibernate,但这是我个人的偏见。
【讨论】:
我没有使用过 NHibernate,但我的一位前同事不得不在他的新雇主处从使用 Linq-to-SQL 切换到 NHibernate,他讨厌它。在他看来,NHibernate 远没有那么强大。 说 NHibernate 远没有那么强大是一回事。举例说明原因是另一回事。根据我的经验,大多数不喜欢 NHibernate 的人在了解了 NHibernate 之后会改变主意。【参考方案6】:为什么不用SqlDataReader 做一个普通的SQL 查询并将它们绑定到一个通用列表。似乎 SQL 比任何 ORM 都更加灵活和强大。反正在实践中!! SQL死了吗?这一定是最快的方法,缺点是 sql 字符串,但你工作得更接近金属,感觉比使用任何 ORM 有更多的控制权。感觉像 ORM:s 总是有一些错误,并且使更复杂的查询变得很痛苦,并且比你应该用纯 SQL 完成它们需要更长的时间来编写它们。还是只有我对 ORM:s 不熟悉?
【讨论】:
“缺点是 sql 字符串”...这就是为什么您将使用存储过程而不是生成这些字符串的原因! SQL 没有死,如果编写正确,它可以非常快速地完成非常复杂的任务。但是 SQL 是一种低级的数据库访问语言。它几乎类似于对 CPU 的汇编指令。它具有特定于供应商的变体来提高性能,您需要深入了解内部结构才能实现,并且它没有更高级别的概念,例如继承。但是现代程序员正在用 C# 等高级语言编写程序。为什么你必须放弃使用低级指令集?像访问其他任何东西一样将其作为对象访问。 但不要误会我的意思,我喜欢 SQL。这是一种解决问题的有趣语言,您可以对数据做一些其他语言无法轻松做到的事情。 不久前有人问过这个问题。我开始接受一些 ORM 解决方案——LINQ2SQL、Entity 和 NHibernate。但是使用数据库进行复杂的操作,我认为你最终需要编写一些 sql。当使用现有代码库主要由存储过程组成的遗留应用程序时,您还需要编写一些 sql。并且sql知识仍然很重要,您需要知道引擎盖下发生了什么。但我不同意这太低级 - 就像组装一样。 它仍然使用与 OO 语言中相同的实体。名称是一列或在 C# 中是一个属性。因此,它在相同的细节级别上运行,但方式不同。 SQL 是基于集合的,而 C# 是一种迭代编程语言。它是不同的,有不同的优点和缺点。以上是关于.net 实体框架与 LinqToSql 相比如何?的主要内容,如果未能解决你的问题,请参考以下文章
实体框架/LINQ/SQL 与实体框架/LINQ/MYSQL
DLinq 演变成哪一个——Linq to SQL 还是实体框架?