现在已经发布了.NET v3.5 SP1(以及VS2008 SP1),现在我们可以访问.NET实体框架了.
我的问题是这个.在尝试使用Entity Framework和LINQ to SQL作为ORM时,有什么区别?
我理解它的方式,实体框架(当与LINQ to Entities一起使用时)是LINQ to SQL的"大哥"?如果是这种情况 - 它有什么优势?它能做什么LINQ to SQL本身无法做到的?
LINQ to SQL仅支持Microsoft SQL Server中可用的数据库表,视图,Sproc和函数的1对1映射.这是一个很好的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是一种快速简便的方法.这意味着如果你正在做一些更小的事情,你会更快,更快地交付.
实体框架是一种全面,无拘无束的方式.这意味着如果你正在做更大的事情,你会花更多时间在前面,发展得更慢,并且具有更大的灵活性.
LINQ to SQL真的死了吗?作者:Jonathan Allen来自InfoQ.com
Matt Warren将[LINQ to SQL]描述为"甚至从未存在过".从本质上讲,它应该是替代它来帮助他们开发LINQ,直到真正的ORM准备就绪.
...
实体框架的规模导致它错过了.NET 3.5/Visual Studio 2008的最后期限.它很快就被命名为".NET 3.5 Service Pack 1",它更像是一个主要版本而不是一个服务包.
...
由于复杂性,开发人员不喜欢[ADO.NET Entity Framework].
...
从.NET 4.0开始,LINQ to Entities将成为LINQ到关系场景的推荐数据访问解决方案.
@lars上发表的文章中列出了许多明显的差异,但简短的回答是:
L2S紧密耦合 - 对象属性与数据库的特定字段或更正确的对象映射到特定的数据库模式
L2S只适用于SQL Server(据我所知)
EF允许将单个类映射到多个表
EF将处理MM关系
EF将能够定位任何ADO.NET数据提供程序
最初的前提是L2S用于快速开发,而EF用于更多"企业级"n层应用程序,但这就是销售L2S有点短.
同构数据源:SQL Server
仅适用于数据结构设计合理的小型项目
无需重新编译SqlMetal.exe即可更改映射
.dbml(数据库标记语言)
表和类之间的一对一映射
支持TPH继承
不支持复杂类型
存储优先方法
以数据库为中心的数据库视图
由C#团队创建
支持但未进一步改进
异构数据源:支持许多数据提供者
推荐用于所有新项目,除了:
小的(LINQ to SQL)
当数据源是平面文件时(ADO.NET)
在设置模型和映射文件元数据工件进程到复制到输出目录时,可以在不重新编译的情况下更改映射
.edmx(实体数据模型),其中包含:
SSDL(存储架构定义语言)
CSDL(概念架构定义语言)
MSL(映射规范语言)
表和类之间的一对一,一对多,多对一映射
支持继承:
TPH(每个层次表)
TPT(每种类型的表)
TPC(每混凝土类别表)
支持复杂类型
代码优先,模型优先,存储优先方法
以应用程序为中心的数据库视图
由SQL Server团队创建
Microsoft Data API的未来
也可以看看:
LINQ to SQL Vs实体框架
LINQ to SQL与实体框架之间的区别
实体框架与LINQ TO SQL
我对实体框架的体验并不那么出色.首先,你必须继承EF基类,所以要对POCO说再见.您的设计必须围绕EF.使用LinqtoSQL,我可以使用现有的业务对象.此外,没有延迟加载,您必须自己实现.有一些工作要使用POCO和延迟加载,但它们存在恕我直言,因为EF尚未准备好.我计划在4.0之后再回来
我在这里找到了一个非常好的答案,它解释了何时使用简单的单词:
使用框架的基本经验法则是如何计划在表示层中编辑数据.
Linq-To-Sql - 如果您计划在表示层中编辑数据的一对一关系,请使用此框架.这意味着您不打算在任何一个视图或页面中组合来自多个表的数据.
实体框架 - 如果您计划在视图或页面中组合来自多个表的数据,请使用此框架.为了更清楚,上述术语特定于将在您的视图或页面中操作的数据,而不仅仅是显示.这一点很重要.
使用实体框架,您可以将表格化数据"合并"在一起,以可编辑的形式呈现给表示层,然后在提交该表单时,EF将知道如何更新各个表中的所有数据.
选择EF而不是L2S可能有更准确的理由,但这可能是最容易理解的.L2S无法合并数据以进行视图呈现.
我的印象是,如果Linq2Sql不符合您的需求,您的数据库非常有用或设计得非常糟糕.我使用Linq2Sql大约有10个网站,无论大小.我已经看了很多次实体框架,但我找不到在Linq2Sql上使用它的一个很好的理由.也就是说我尝试将我的数据库用作模型,因此我已经在模型和数据库之间进行了1对1的映射.
在我目前的工作中,我们有一个包含200多个表的数据库.一个包含大量不良解决方案的旧数据库,因此我可以看到实体框架优于Linq2Sql,但我仍然希望重新设计数据库,因为数据库是应用程序的引擎,如果数据库设计错误,那么我的应用程序速度慢也会很慢.在这样的数据库上使用Entity框架似乎是一个快速修复来掩盖坏模型,但它永远不会掩盖从这样的数据库中获得的糟糕性能.
你可以在这里找到一个很好的比较:
http://www.dotnet-tricks.com/Tutorial/entityframework/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的提供者:
由Microsoft提供:
适用于SQL Server,OBDC和OLE DB的ADO.NET驱动程序
通过第三方提供商:
MySQL的
神谕
DB2
VistaDB的
SQLite的
PostgreSQL的
Informix的
U2
SYBASE
Synergex公司
火鸟
Npgsql的
仅举几例.
这使得EF成为关系数据存储的强大编程抽象,这意味着无论底层数据存储如何,开发人员都可以使用一致的编程模型.在您开发要确保与各种常见RDBMS互操作的产品的情况下,这可能非常有用.
抽象有用的另一种情况是,您是开发团队的一员,与许多不同的客户或组织内的不同业务部门合作,并且您希望通过减少他们必须成为的RDBMS的数量来提高开发人员的工作效率熟悉以便在不同的RDBMS之上支持一系列不同的应用程序.
我发现在使用EF时我无法在同一数据库模型中使用多个数据库.但是在linq2sql中,我可以通过在模式名称前加上数据库名称.
这是我最初开始使用linq2sql的原因之一.我不知道EF是否已经允许这个功能,但我记得读过它的意图是不允许这样做.
如果您的数据库简单明了,LINQ to SQL就可以了.如果您需要在表顶部使用逻辑/抽象实体,那么请转到Entity Framework.
它们都不支持唯一的SQL 2008数据类型.与我的观点不同的是,Entity仍然有机会在未来的某个版本中围绕我的地理数据类型构建模型,Linq to SQL被抛弃,永远不会.
想知道nHibernate或OpenAccess的用途......
我想如果你需要快速开发一些东西,而中间没有奇怪的东西,你需要设施来代表你的表:
Linq2Sql可以是一个很好的联盟,使用它与LinQ释放出一个很好的开发时机.
我正在为有一个使用Linq-to-SQL的大项目的客户工作.当项目启动时,它是显而易见的选择,因为当时实体框架缺少一些主要功能,Linq-to-SQL的性能要好得多.
现在EF已经发展,Linq-to-SQL缺乏异步支持,这对于高度可扩展的服务非常有用.有时我们每秒有100多个请求,尽管我们已经优化了数据库,但大多数查询仍需要几毫秒才能完成.由于同步数据库调用,线程被阻止,不可用于其他请求.
我们正在考虑切换到实体框架,仅用于此功能.遗憾的是,微软并没有在Linq-to-SQL中实现异步支持(或者是开源的,所以社区可以做到这一点).
附录2018年12月: Microsoft正在向.NET Core发展,Linq-2-SQL不支持.NET Core,因此您需要迁移到EF以确保将来可以迁移到EF.Core.
还有一些其他选项需要考虑,例如LLBLGen.这是一个成熟的ORM解决方案,已经存在很长时间,并且已被证明比MS数据解决方案(ODBC,ADO,ADO.NET,Linq-2-SQL,EF,EF.core)更具有前瞻性.