.NET 4.0entity framework和LINQ to SQL有什么区别?

我正在检查Professional ASP.NET MVC的第二版,并且实现了EFreplaceLINQ to SQL。 我对第一本书的LINQ to SQL很熟悉,但是我对EF一无所知。 无论如何,在阅读代码的时候,除了名字之外似乎没有任何改变。 相同的旧的存储库类,相同的旧function。

我做了一些研究。 我知道LINQ不仅限于SQL。 此外,EF不限于Microsoft家族SQL服务器。 在这个2岁的问题,人们对EF不满意,说这是过于复杂和所有。 但现在我正在阅读EF名下的相同代码。 只有类是由LINQ to SQL的ADO.NET实体模型生成的。 任何人都可以清楚EFfunction的大惊小怪,因为它现在是事实上的标准ORM?

它们有点类似,可以按照代码方式以非常相似的方式使用,但它们有一些重要的区别。 请注意,“LINQ”与“LINQ to SQL”不同; EF也使用LINQ。 一些显着的差异是:

  • LINQ to SQL在很大程度上只是SQL Server,而不是通过devise来实现。 如果您有兼容的ADO.NET提供程序,则EF旨在支持并支持多个数据库。
  • 开箱即用,LINQ to SQL对数据库元数据更改的描述非常糟糕。 您必须从零开始重新生成模型的一部分,并且会丢失自定义。
  • EF支持多对多的关系和inheritance等模型function。 LINQ to SQL不直接支持这些。
  • 在.NET 3.5中,LINQ to SQL比EF更好地支持SQL-Server特有的function。 在.NET 4中这大部分都不是这样; 他们在这方面非常相似。
  • EF可让您select“模型优先”,“数据库优先”或“代码优先”build模。 LINQ to SQL,开箱即用,确实只支持DB First。

英孚与v4.0成熟。 在此之前,使用起来有点痛苦,我不推荐它。 现在我的build议是,所有新的LINQ到DB代码使用EF4。

就新function而言,LINQ部分实际上与LINQ to SQL非常相似。 但是,这是一个完全不同的架构:EF4充当(EF)ADO.NET提供者的LINQ提供者,然后包装另一个ADO.NET提供者。 所以有一些新的东西,如Entity SQL(我不使用)和EF支持不同的基础ADO.NET提供程序(我使用)。

EF使用的XMLbuild模系统也允许更强大的映射抽象 。 我经常使用的是具有不同的表,具有相同的主键映射到实体inheritance关系; 从我的理解,在LINQ to SQL中执行此操作的唯一方法是通过“select器列”(尽pipe我从来没有在LINQ to SQL中尝试过)。

LINQ to SQL和entity framework之间的区别:

LINQ to SQL:

  • 它只适用于SQL Server数据库。
  • 它会生成一个.dbml来维护关系
  • 它不支持复杂的types。
  • 它不能从模型生成数据库。
  • 它只允许在实体类和关系表/视图之间进行一对一的映射。
  • 它允许你使用DataContext查询数据。
  • 它提供了一个紧密耦合的方法。
  • 它只能用于SQL Server才能用于快速应用程序开发。

entity framework

  • 它可以处理各种数据库,如Oracle,DB2,MYSQL,SQL Server等

  • 它最初生成一个.edmx文件。 该关系使用3个不同的文件.csdl,.msl和.ssdl来维护

  • 它支持复杂types。

  • 它可以从模型生成数据库。

  • 它允许实体类和关系表/视图之间的一对一,一对多和多对多的映射

  • 它允许你使用EntitySQL,ObjectContext,DbContext查询数据。

  • 它提供了一个松散耦合的方法。 由于它的代码第一种方法允许您使用使它松散耦合的dependency injection模式。

  • 它可以用于与SQL Server,Oracle,DB2和MySQL等RDBMS一起快速开发应用程序。

更多细节

最新的EF更强大,你不会被迫进入一个devise者驱动的伪ORM体验(或者如果你没有devise者就试图去做这个configuration,那么就是一个configuration错误)。 你的模型现在可以成为POCO对象,而不是一些devise师驱动的部分类被破坏的bs,它与devise者驱动的代码本身耦合在一起,你完全可以远离devise师,而不会感觉你在向上游游泳,总的来说,感觉就像他们有听取了社区的意见,或者实际上试图模仿现有的,经过testing的解决scheme,而不是为“Morts”或L2Sql应该是什么版本。