Entity Framework vs LINQ to SQL既然已经发布了.NET v3.5 sp1(以及vs2008 sp1),我们现在就可以访问.NET实体框架了。 我的问题是。当试图决定使用实体框架和LinqToSQL作为ORM时,有什么区别? 据我所知,实体框架(与linq to entities一起使用时)是linq to sql的"大哥"?如果是这样的话——它有什么好处?它能做什么?Linq to SQL不能自己做什么? Linq to SQL仅支持Microsoft SQL Server中可用的数据库表、视图、存储过程和函数的1到1映射。它是一个很好的API,可用于相对设计良好的SQL Server数据库的快速数据访问构造。Linq2SQL最初是使用C_3.0和.NET Framework 3.5发布的。 LINQtoEntities(ADO.NET实体框架)是一个ORM(对象关系映射器)API,允许对对象域模型及其与许多不同ADO.NET数据提供程序的关系进行广泛定义。因此,您可以混合和匹配多个不同的数据库供应商、应用程序服务器或协议,以设计由各种表、源、服务等构成的对象聚合聚合聚合聚合聚合。ADO.NET Framework随.NET Framework 3.5 SP1发布。 这是一篇关于msdn的很好的介绍性文章:将LINQ引入关系数据 我认为快速而肮脏的答案是
Linq to SQL真的死了吗?乔纳森艾伦为infoq.com
在文章@lars中有很多明显的差异,但简短的回答是:
最初的前提是L2S用于快速开发,而EF用于更多的"企业级"n层应用程序,但这只是销售L2S的一小部分。 解决并发冲突 实体框架
参见:
我在实体框架方面的经验还不算一流。首先,您必须从ef基类继承,所以向poco说再见。你的设计必须围绕英孚。使用LinqToSQL,我可以使用现有的业务对象。另外,没有延迟加载,您必须自己实现。有一些解决方案可以使用POCO和懒惰加载,但是它们存在于IMHO中,因为EF还没有准备好。我计划在4点0分后再来。 我在这里找到了一个很好的答案,解释了什么时候使用简单的词:
我的印象是,如果Linq2SQL不适合您的需要,您的数据库就相当单调或设计得很糟糕。我有大约10个网站,大小都使用linq2sql。我已经看过和实体框架很多次了,但是我找不到一个在linq2sql上使用它的好理由。也就是说,我尝试使用我的数据库作为模型,所以我已经在模型和数据库之间有了1到1的映射。 在我目前的工作中,我们有一个200多个表的数据库。一个旧的数据库,有很多坏的解决方案,所以在那里我可以看到实体框架优于linq2sql的好处,但是我还是更愿意重新设计数据库,因为数据库是应用程序的引擎,如果数据库设计不好,速度慢,那么我的应用程序也会慢。在这样的数据库上使用实体框架看起来像是一个快速修复程序来掩盖坏的模型,但它永远无法掩盖从这样的数据库中获得的坏性能。 你可以在这里找到一个很好的对比: http://www.dotnet-tricks.com/tutorial/entity framework/1M5W300314-difference-between-linq-to-sql-and-entity-framework.html http://www.c-sharpcorner.com/blogs/entity-framework-vs-linq-to-sql1 这里的答案涵盖了linq2sql和ef之间的许多差异,但是有一个关键点却没有得到足够的重视:linq2sql只支持SQL Server,而ef有以下RDBMS的提供程序: 微软提供:
通过第三方提供商:
举几个例子。 这使得ef成为关系数据存储上强大的编程抽象,这意味着无论底层数据存储如何,开发人员都可以使用一致的编程模型。在您开发的产品要确保能够与各种通用RDBMS进行互操作的情况下,这可能非常有用。 另一种情况是,抽象是有用的,即你是开发团队的一部分,与许多不同的客户或组织内的不同业务部门合作,你希望通过减少他们必须熟悉的RDBMS数量来提高开发人员的生产力,以支持一系列不同的NT应用程序位于不同的RDBMS之上。 我发现在使用ef时,不能在同一个数据库模型中使用多个数据库。但是在linq2sql中,我可以通过在模式名前面加上数据库名来实现。 这是我最初开始使用linq2sql的原因之一。我不知道ef是否允许这个功能,但我记得我读到它的目的是不允许这个功能。 如果您的数据库简单明了,那么linq to sql就可以了。如果您需要在表的顶部放置逻辑/抽象的实体,那么请使用实体框架。 两者都不支持唯一的SQL 2008数据类型。从我的角度来看,不同的是,在未来的某个版本中,实体仍然有机会围绕我的地理数据类型构建一个模型,而Linq-to-SQL则永远不会被放弃。 想知道NHibernate或OpenAccess是怎么回事… 我认为,如果您需要快速开发一些中间没有奇怪事物的东西,并且您需要该工具让实体代表您的表: Linq2SQL可以是一个很好的联盟,与Linq一起使用可以释放出一个很好的开发时间。 我为一个使用Linq to SQL的大型项目的客户工作。当项目启动时,这是一个显而易见的选择,因为实体框架当时缺乏一些主要的特性,而且LinqToSQL的性能要好得多。 现在,EF已经发展起来,LinqtoSQL缺少异步支持,这对于高度可扩展的服务来说非常有用。我们有时每秒有100多个请求,尽管我们已经优化了数据库,但大多数查询仍然需要几毫秒才能完成。由于同步数据库调用,线程被阻塞,不能用于其他请求。 我们正在考虑切换到实体框架,仅仅是为了这个特性。很遗憾,微软没有在linq to sql中实现异步支持(或者开放源代码,这样社区就可以做到)。 附录2018年12月:微软正在向.NET核心迈进,而linq-2-sql在.NET核心上不受支持,因此您需要转到ef,以确保将来可以迁移到ef.core。 还有一些其他的选择需要考虑,例如llblgen。它是一个成熟的ORM解决方案,已经存在很长时间,并且已经被证明比MS数据解决方案(odbc、ado、ado.net、linq-2-sql、ef、ef.core)更具前瞻性。 LinqtoSQL和实体框架表面上看起来很相似。它们都提供使用数据模型查询数据库。 Linq to SQL是从Linq项目演变而来的,该项目来自于与语言开发。而实体框架是数据可编程性团队的一个项目,主要关注实体SQL语言。微软并不打算将Linq降级为SQL。 当实体框架具有独立的API时,linq to sql仍然是ado.net的一部分。实体框架是linq to sql的更高版本。实体框架使用实体数据模型在应用程序和数据存储之间架桥。实体数据模型(Entity Data Model,简称EDM)提供概念模式的定义,以及与数据库交互所需的数据库模式信息,最后是链接到两个模式的映射模式。 下面是由实体框架(实体数据模型)执行的一些任务。 ?从模型自动生成类并更新这些类任何时候模型改变都是动态的。 ?处理好所有的数据库连接,这样开发人员就不必为与数据库交互而编写大量代码而感到负担了。 ?提供查询模型而不是数据库的通用查询语法,然后将这些查询转换为数据库可以理解的查询。 ?提供一种机制,用于跟踪对模型对象所做的更改用于应用程序并处理对数据库的更新。
它是提供程序,仅支持SQL Server。这是一种将SQL Server数据库表映射到.NET对象的映射技术。是微软第一次尝试ORM对象关系映射器。
同样的想法,但是在后台使用实体框架,就像微软的ORM一样,它支持多个数据库,实体框架的主要优点是开发人员可以在任何数据库上工作,不需要学习语法就可以在不同的数据库上执行任何操作。
|