关于.NET:Entity Framework vs Linq to SQL

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引入关系数据


我认为快速而肮脏的答案是

  • LinqtoSQL是一种快速而简单的方法。这意味着如果你在做一些小的事情,你会走得更快,交付更快。
  • 实体框架是一种全力以赴的、不受约束的方法。这意味着如果你在做一些更大的事情,你将需要更多的时间提前,发展较慢,并且有更多的灵活性。


Linq to SQL真的死了吗?乔纳森艾伦为infoq.com

Matt Warren describes [LINQ to SQL] as something that"was never even supposed to exist." Essentially, it was just supposed to be stand-in to help them develop LINQ until the real ORM was ready.

...

The scale of Entity Framework caused it to miss the .NET 3.5/Visual Studio 2008 deadline. It was completed in time for the unfortunately named".NET 3.5 Service Pack 1", which was more like a major release than a service pack.

...

Developers do not like [ADO.NET Entity Framework] because of the complexity.

...

as of .NET 4.0, LINQ to Entities will be the recommended data access solution for LINQ to relational scenarios.


在文章@lars中有很多明显的差异,但简短的回答是:

  • L2S是紧密耦合的-对象属性到数据库的特定字段,或者对象映射到特定的数据库模式。
  • L2S只能与SQL Server一起工作(据我所知)
  • EF允许将单个类映射到多个表
  • EF将处理M-M关系
  • EF将能够以任何ADO.NET数据提供程序为目标

最初的前提是L2S用于快速开发,而EF用于更多的"企业级"n层应用程序,但这只是销售L2S的一小部分。


解决并发冲突

  • 同构数据源:SQL Server
  • 仅适用于数据结构设计良好的小型项目
  • 可以更改映射,而无需使用sqlmetal.exe重新编译
  • .dbml(数据库标记语言)
  • 表和类之间的一对一映射
  • 支持TPH继承
  • 不支持复杂类型
  • 存储优先方法
  • 以数据库为中心的数据库视图
  • 由C团队创建
  • 支持但不打算进一步改进
  • 实体框架

  • 异源数据源:支持许多数据提供者
  • 建议用于除以下项目以外的所有新项目:
    • 小的(Linq to SQL)
    • 当数据源是平面文件(ADO.NET)时
  • 当设置模型和映射文件元数据工件过程以复制到输出目录时,可以在不重新编译的情况下更改映射
  • .edmx(实体数据模型),其中包含:
    • 存储模式定义语言
    • 概念模式定义语言
    • 映射规范语言
  • 表和类之间的一对一、一对多、多对一映射
  • 支持继承:
    • TPH(每个层次结构的表)
    • TPT(每种类型的表)
    • TPC(混凝土等级表)
  • 支持复杂类型
  • 代码优先、模型优先、存储优先
  • 以应用程序为中心的数据库视图
  • 由SQL Server团队创建
  • Microsoft数据API的未来
  • 参见:

    • LINQ到SQL与实体框架
    • Linq to SQL和实体框架之间的区别
    • 实体框架与Linq to SQL

    我在实体框架方面的经验还不算一流。首先,您必须从ef基类继承,所以向poco说再见。你的设计必须围绕英孚。使用LinqToSQL,我可以使用现有的业务对象。另外,没有延迟加载,您必须自己实现。有一些解决方案可以使用POCO和懒惰加载,但是它们存在于IMHO中,因为EF还没有准备好。我计划在4点0分后再来。


    我在这里找到了一个很好的答案,解释了什么时候使用简单的词:

    The basic rule of thumb for which framework to use is how to plan on
    editing your data in your presentation layer.

    • Linq-To-Sql - use this framework if you plan on editing a one-to-one
      relationship of your data in your presentation layer. Meaning you
      don't plan on combining data from more than one table in any one view
      or page.

    • Entity Framework - use this framework if you plan on
      combining data from more than one table in your view or page. To make
      this clearer, the above terms are specific to data that will be
      manipulated in your view or page, not just displayed. This is
      important to understand.

    With the Entity Framework you are able to"merge" tabled data together
    to present to the presentation layer in an editable form, and then
    when that form is submitted, EF will know how to update ALL the data
    from the various tables.

    There are probably more accurate reasons to choose EF over L2S, but
    this would probably be the easiest one to understand. L2S does not
    have the capability to merge data for view presentation.


    我的印象是,如果Linq2SQL不适合您的需要,您的数据库就相当单调或设计得很糟糕。我有大约10个网站,大小都使用linq2sql。我已经看过和实体框架很多次了,但是我找不到一个在linq2sql上使用它的好理由。也就是说,我尝试使用我的数据库作为模型,所以我已经在模型和数据库之间有了1到1的映射。

    在我目前的工作中,我们有一个200多个表的数据库。一个旧的数据库,有很多坏的解决方案,所以在那里我可以看到实体框架优于linq2sql的好处,但是我还是更愿意重新设计数据库,因为数据库是应用程序的引擎,如果数据库设计不好,速度慢,那么我的应用程序也会慢。在这样的数据库上使用实体框架看起来像是一个快速修复程序来掩盖坏的模型,但它永远无法掩盖从这样的数据库中获得的坏性能。


    你可以在这里找到一个很好的对比:

    enter image description here

    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的提供程序:

    微软提供:

    • 用于SQL Server、OBDC和OLE DB的ADO.NET驱动程序

    通过第三方提供商:

    • MySQL
    • 甲骨文公司
    • DB2
    • 维斯塔德
    • 数据库
    • 波斯特雷斯尔
    • Informix
    • U2
    • 赛贝斯
    • 增效剂
    • 火鸟
    • NPGSQL

    举几个例子。

    这使得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)提供概念模式的定义,以及与数据库交互所需的数据库模式信息,最后是链接到两个模式的映射模式。

    下面是由实体框架(实体数据模型)执行的一些任务。

    ?从模型自动生成类并更新这些类任何时候模型改变都是动态的。

    ?处理好所有的数据库连接,这样开发人员就不必为与数据库交互而编写大量代码而感到负担了。

    ?提供查询模型而不是数据库的通用查询语法,然后将这些查询转换为数据库可以理解的查询。

    ?提供一种机制,用于跟踪对模型对象所做的更改用于应用程序并处理对数据库的更新。


    Linq-to-SQL

    它是提供程序,仅支持SQL Server。这是一种将SQL Server数据库表映射到.NET对象的映射技术。是微软第一次尝试ORM对象关系映射器。

    Linq-to-Entities

    同样的想法,但是在后台使用实体框架,就像微软的ORM一样,它支持多个数据库,实体框架的主要优点是开发人员可以在任何数据库上工作,不需要学习语法就可以在不同的数据库上执行任何操作。

    According to my personal experience Ef is better (if you have no idea about SQL)
    performance in LINQ is little bit faster as compare to EF reason LINQ language written in lambda.


    推荐阅读