2008-11-06 33 views
9

我听说过,实体框架过度杀伤,或者与LinqToSql相比很难学习。.net实体框架如何过度杀伤LinqToSql?

我在想什么?我使用LinqToSql并喜欢它。所以,我正在尝试EF和我所做的事情,他们看起来几乎完全一样。名称空间和方法名称是不同的,但到目前为止,我没有看到任何使EF比LinqToSql更难的东西。

我确定如果我开始做更多的事情它会变得更复杂。但是,我可能再也不能对LinqToSql做同样的事情,所以我认为这是EF的一个优点,以防万一我想做更复杂的事情。

是否EF使用比LinqToSql更多的资源以至于我不应该使用它,如果我需要的只是LinqToSql-like功能?

更新: 我做了一些测试,我的测试似乎指向Linq to Entities执行比Linq to SQL更好的实体。

我首先从一张表中删除1000条记录,添加1000条记录,编辑1000条记录,然后将它们数据绑定到一个DataView。 LinqToSQL:5秒LinqToEntities:2秒

我使用两个连接表执行相同的测试,结果相似。

我的测试似乎支持另一篇文章: Linq To Sql vs Entity Framework Performance

更新2:

感谢您的答复。在我看来,Linq to Entities对于Linq to SQL来说并不是真正的矫枉过正。经过更多的研究,我认为与Linq去实体是一条路。它似乎有更好的表现。

我相信我听到的“矫枉过正”的声明是因为Linq to Entities可以做得比Linq要多得多,而且它确实需要更多配置(web.config中另有大约1行)。此外,Linq to Entities与Linq to SQL的不同之处在于,可能会让人觉得Linq to Entities更复杂。但是,一旦你学会了如何做事,看起来Linq to Entities并不比Linq to SQL复杂。

回答

3

我的答案:做一个简单的比较时间来执行一个简单的获取/编辑/更新序列。我想你会发现LINQ to SQL的速度是其两倍。我在调查差异时做了一个快速比较项目。
其中结果: 实体框架8700毫秒 的LINQ to SQL 3100毫秒 数据集2000毫秒

所以对我来说这是一个简单的问题。使用DataSets或使用Linq-Sql - 实体框架甚至没有考虑到它!

link text

+0

我终于做了一个测试,而我却以相反的方式感到惊讶。我不知道我的测试是否有效,但我首先删除1000条记录,添加1000条记录,编辑1000条记录,然后将它们数据绑定到DataView。 LinqToSQL:5秒 LinqToEntities:2秒 – dtc 2008-12-16 01:29:20

+1

DataSets?呃...还有很多其他的框架(例如Subsonic,NHibernate等)。更不用说定制开发了,我仍然更喜欢它。我从来没有遇到过使用DataSets的项目,我认为它甚至是远程清理的。 – senfo 2008-12-30 03:08:09

+0

除了性能测试之外,您还应该看看需要多少时间和精力来制作任何您想要的框架。正如senfo所指出的那样,DataSets可能会很快,但它们并不是那么棒。 – 2009-02-04 08:40:41

12

纠正我,如果我错了,但实体框架应该才开始发挥作用时,您需要转换后端的对象,当你合并来自不同数据源的表,分裂样表格等。它增加了实体层,所以你可以隐藏所有的管道,只处理你的清理实体。如果你只是像使用LINQ to SQL一样在表中使用1作为1,那么我相信你没有使用的复杂层将会减慢它的速度。听起来像LINQ to SQL是适合您的案例的正确工具,直到您有更复杂的数据源需求。

+0

LINQ to SQL始终是正确工作的正确工具; -p – Svish 2009-02-04 08:52:44

3

在您开始使用Linq To SQL之前,请通过程序管理器查看this article。他提出了一个直截了当的问题:“LINQ to SQL死了吗?”答案并不那么简单。这绝对不是“不”。听起来更像“可能也许”。

我会建议在潜入EF之前(现在称为Linq To Entities),你认真考虑NHibernate,但那是我个人的偏见。

8

Linq to SQL和Entity Framework是概念上不同的野兽,你应该根据它们如何适合你的需要而不是基于微观基准来做出选择。即使Entity Framework速度较慢,它也是ADO.NET团队在Microsoft的关注焦点,并且会多次改进。 Linq-to-SQL被有效地冻结。

从概念上说,他们不同之处在于Linq-to-SQL只是使用Linq执行数据库查询的一种方式。听起来很明显,但重点是:您正在访问数据,按照其数据库模型构建。尽管适当地转换了FK,但您仍然有超额的对象,其中数据被标准化为不同的表格。你写的每个查询都要应付这种事情。

实体框架允许您声明性地构建一个图层,该图层以应该在内存中表示的方式表示您的数据,将来自多个表的数据转换为适用的单个对象;将多对多关系表示为集合属性等等。然后,您编写的查询将发布到此模型中,并且将更加清晰和明显(不超过15个表连接!)。

如果您不确定如何使用实体框架,O'Reilly将于2009年1月15日推出Entity Framework的全面书籍(现在可以在Roughcuts上获得预览版) - MSDN文档在目前非常吸引人,提出更难。我相信,从长远来看,除了最琐碎的项目之外,还值得使用它(如果我正在编写一些微不足道的东西,我会直接使用ADO.NET2并忘记Linq)。

4

但要小心,LinqToEntities可以做一些非常有趣的事情,如果你使用查询 - 例如 - group by。我从来没有设法让LinqToEntities将一个组转换成一个实际的SQL组,而是产生了一些可能非常无效的海量代码块。

例如,请查看以下链接: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/bb72fae4-0709-48f2-8f85-31d0b6a85f68

如果尝试写“不平凡”的查询,ObjectQuery.ToTraceString()是你最好的朋友,以确保EF没做什么真的很蠢,在你背后。

2

为什么不只是用SqlDataReader进行普通的SQL查询并将它们绑定到通用列表。看起来像SQL比任何ORM都更加灵活和强大。无论如何,在实践中! SQL死了吗?这一定是最快的方法,缺点是sql字符串,但是你正在接近金属,并且感觉你比使用任何ORM有更多的控制。感觉像ORM:它总是有一些bug,并且使得更复杂的查询在屁股上变得很痛苦,并且比用普通SQL做它们要花费更多的时间。还是仅仅是我对ORM有点陌生:对吗?