现在已经发布了.NET v3.5 SP1(以及VS2008 SP1),我们现在可以访问.NET实体框架。
我的问题是这个。当尝试在使用实体框架和LINQ to SQL作为ORM之间做出决定时,有什么区别?
据我了解,实体框架(当与LINQ to Entities一起使用时)是LINQ to SQL的“老大哥”吗?如果是这样,它有什么优势?LINQ to SQL不能单独做什么?
现在已经发布了.NET v3.5 SP1(以及VS2008 SP1),我们现在可以访问.NET实体框架。
我的问题是这个。当尝试在使用实体框架和LINQ to SQL作为ORM之间做出决定时,有什么区别?
据我了解,实体框架(当与LINQ to Entities一起使用时)是LINQ to SQL的“老大哥”吗?如果是这样,它有什么优势?LINQ to SQL不能单独做什么?
Answers:
LINQ to SQL仅支持Microsoft SQL Server中可用的数据库表,视图,存储过程和函数的一对一映射。这是一个很棒的API,可用于对相对设计良好的SQL Server数据库进行快速数据访问构建。LINQ2SQL最初与C#3.0和.Net Framework 3.5一起发布。
LINQ to Entities(ADO.Net实体框架)是一个ORM(对象关系映射器)API,它允许对对象域模型及其与许多不同的ADO.Net数据提供者的关系进行广泛定义。这样,您可以混合并匹配许多不同的数据库供应商,应用程序服务器或协议,以设计由各种表,源,服务等构造的对象的聚合混搭。ADO.Net Framework随.Net Framework 3.5 SP1。
这是有关MSDN的不错的入门文章:将 LINQ引入关系数据
我认为快速而肮脏的答案是
LINQ to SQL真的死了吗?通过乔纳森·艾伦为InfoQ.com
马特·沃伦(Matt Warren)将[LINQ to SQL]描述为“甚至都不应该存在”。本质上,它只是作为替身来帮助他们开发LINQ,直到真正的ORM准备就绪为止。
...
实体框架的规模导致它错过了.NET 3.5 / Visual Studio 2008截止日期。它已及时完成,不幸的是命名为“ .NET 3.5 Service Pack 1”,它更像是主要版本,而不是Service Pack。
...
由于复杂性,开发人员不喜欢[ADO.NET实体框架]。
...
从.NET 4.0开始,LINQ to Entities将成为LINQ to Relational方案的推荐数据访问解决方案。
@lars发布的文章概述了许多明显的区别,但简短的答案是:
最初的前提是L2S是用于快速开发,而EF是用于更多的“企业” n层应用程序,但这使L2S卖得短了一点。
也可以看看:
dbSet<Orders>.Where()...ToList()
?我认为,从LINQ到SQL反对使用Entity Framework是一种误导。
我在Entity Framework方面的经验不足。首先,您必须继承EF基类,因此请与POCO道别。您的设计必须围绕EF。通过LinqtoSQL,我可以使用现有的业务对象。此外,没有延迟加载,您必须自己实现。有一些解决方法可以使用POCO和延迟加载,但是它们存在恕我直言,因为EF尚未准备好。我打算在4.0之后再回来
我在这里找到了一个很好的答案,该答案以简单的语言解释了何时使用:
使用哪种框架的基本经验法则是如何计划在表示层中编辑数据的计划。
Linq-To-Sql-如果计划在表示层中编辑数据的一对一关系,请使用此框架。这意味着您不打算在任何一个视图或页面中合并来自多个表的数据。
实体框架 -如果您计划合并视图或页面中多个表中的数据,请使用此框架。为了使这一点更清楚,上述术语特定于将在视图或页面中操作的数据,而不仅仅是显示的数据。了解这一点很重要。
使用实体框架,您可以将表中的数据“合并”在一起,以可编辑的形式呈现给表示层,然后在提交该表单时,EF将知道如何更新各个表中的所有数据。
选择EF而不是L2S可能有更准确的理由,但这可能是最容易理解的理由。L2S不具有合并数据以进行视图表示的功能。
我的印象是,如果Linq2Sql不符合您的需求,则您的数据库相当庞大或设计不当。我有大约10个网站,无论大小,都使用Linq2Sql。我已经看过很多次Entity框架,但是找不到在Linq2Sql上使用它的充分理由。也就是说,我尝试将数据库用作模型,因此我已经在模型和数据库之间建立了一对一的映射。
在我目前的工作中,我们有一个包含200多个表的数据库。一个有很多不良解决方案的旧数据库,所以我可以看到Entity Framework优于Linq2Sql的好处,但是我仍然希望重新设计数据库,因为数据库是应用程序的引擎,如果数据库设计不良且运行缓慢,则我的应用程序也会很慢。在这样的数据库上使用Entity Framework似乎是掩盖不良模型的快速修补程序,但它永远无法掩盖从此类数据库中获得的不良性能。
您可以在这里找到一个很好的比较:
http://www.c-sharpcorner.com/blogs/entity-framework-vs-linq-to-sql1
sqlmetal.exe
docs.microsoft.com/zh-cn/dotnet/framework/tools/…从数据库中生成代码/映射Linq to SQL
此处的答案涵盖了Linq2Sql和EF之间的许多区别,但是有一个关键点并未得到足够的重视:Linq2Sql仅支持SQL Server,而EF具有以下RDBMS的提供程序:
由Microsoft提供:
通过第三方提供商:
仅举几例。
这使EF成为关系数据存储上强大的编程抽象,这意味着开发人员可以使用一致的编程模型来使用基础数据存储。在您要开发的产品中,要确保将其与各种常见RDBMS互操作的情况下,这可能非常有用。
这种抽象很有用的另一种情况是,您是与多个不同客户或组织内不同业务部门一起工作的开发团队的一员,并且您希望通过减少必须成为RDBMS的RDBMS的数量来提高开发人员的生产率。为了支持在不同RDBMS之上的一系列不同应用程序而熟悉。
如果您的数据库简单明了,则LINQ to SQL可以。如果您需要在表顶部放置逻辑/抽象的实体,请使用Entity Framework。
两者均不支持唯一的SQL 2008数据类型。从我的角度来看,不同之处在于,在某些将来的版本中,Entity仍然有机会围绕我的地理数据类型构建模型,而Linq to SQL被遗弃,永远不会。
想知道nHibernate或OpenAccess是怎么回事...
我认为,如果您需要快速开发某些东西而中间没有任何奇怪的东西,并且您需要该工具具有代表表的实体:
Linq2Sql可以是一个很好的盟友,将它与LinQ一起使用可以释放出很好的开发时机。
我正在为拥有使用Linq-to-SQL的大型项目的客户工作。当项目开始时,这是显而易见的选择,因为当时Entity Framework缺少一些主要功能,并且Linq-to-SQL的性能要好得多。
现在EF已经发展,Linq-to-SQL缺少异步支持,这对于高度可扩展的服务非常有用。有时我们每秒有100多个请求,尽管我们已经优化了数据库,但是大多数查询仍然需要几毫秒才能完成。由于同步数据库调用,该线程被阻塞,无法用于其他请求。
我们正在考虑仅出于此功能而切换到实体框架。遗憾的是,Microsoft没有在Linq-to-SQL中实现异步支持(或开源了,因此社区可以做到)。
附录2018年12月: Microsoft正在向.NET Core迁移,并且.NET Core不支持Linq-2-SQL,因此您需要移至EF以确保将来可以迁移至EF.Core。
还需要考虑其他一些选项,例如LLBLGen。它是一种成熟的ORM解决方案,已经存在了很长时间,并且已被证明比MS数据解决方案(ODBC,ADO,ADO.NET,Linq-2-SQL,EF,EF.core)更具前瞻性。
Linq到SQL
它是提供程序,仅支持SQL Server。这是一种将SQL Server数据库表映射到.NET对象的映射技术。这是Microsoft首次尝试使用ORM-对象关系映射器。
LINQ到实体
是相同的想法,但是在后台使用实体框架,就像ORM一样(来自Microsoft),它支持多个数据库实体框架的主要优点是开发人员可以在任何数据库上工作,而无需学习语法来对不同的不同数据库执行任何操作
根据我的个人经验,与以lambda编写的EF原因LINQ语言相比,Ef在LINQ中的性能更好(如果您不了解SQL)。