实体框架VS LINQ to SQL VS ADO.NET与存储过程?

Entity Framework VS LINQ to SQL VS ADO.NET with stored procedures?

您将如何评价每一个方面的:

  • 性能
  • 发展速度
  • 简洁、直观、可维护的代码
  • 灵活性
  • 总体
  • 我喜欢我的SQL,因此一直是ADO.NET和存储过程的铁杆粉丝,但我最近玩了一个从LINQ到SQL的游戏,被我写数据访问层的速度搞得晕头转向,并决定花些时间真正了解LINQ到SQL或EF…或者两者都不是?

    我只是想检查一下,这些技术中没有什么大缺陷会使我的研究时间变得无用。例如,性能很糟糕,对于简单的应用程序来说很酷,但只能带你走这么远。

    更新:你能专注于EF vs L2S vs SP而不是ORM vs SP吗?我主要对ef和l2s感兴趣,但我也希望将它们与存储过程进行比较,因为我对纯SQL了解很多。


    首先,如果您正在启动一个新项目,请使用实体框架("ef")—它现在生成了更好的SQL(更像Linq to SQL那样),并且比Linq to SQL("L2s")更易于维护和更强大。随着.NET 4.0的发布,我认为Linq to SQL是一种过时的技术。微软一直非常开放,不继续L2S的进一步发展。

    1)性能

    这很难回答。对于大多数单实体操作(CRUD),您将发现这三种技术的性能几乎相同。您必须知道ef和linq-to-sql是如何工作的,才能充分利用它们。对于诸如轮询查询之类的大容量操作,您可能希望让EF/L2S"编译"您的实体查询,这样框架就不必不断地重新生成SQL,或者您可能会遇到可伸缩性问题。(参见编辑)

    对于正在更新大量数据的批量更新,原始SQL或存储过程将始终比ORM解决方案执行得更好,因为您不必通过连接到ORM的线路编组数据来执行更新。

    2)发展速度

    在大多数情况下,当涉及到开发速度时,EF将吹走裸SQL/存储过程。EF设计器可以在模型更改时(根据请求)从数据库中更新模型,因此不会在对象代码和数据库代码之间遇到同步问题。唯一一次我不会考虑使用ORM的时候是你在做一个报告/仪表板类型的应用程序,你不做任何更新,或者你创建一个应用程序只是为了对数据库进行原始数据维护操作。

    3)整洁/可维护的代码

    动手,ef胜过sql/存储过程。因为您的关系是建模的,所以代码中的连接相对较少。对于大多数查询,实体之间的关系对于读者几乎是不明显的。没有什么比从一层到另一层调试或通过多个SQL/中间层来了解数据实际发生了什么更糟糕的了。EF以一种非常强大的方式将数据模型引入到代码中。

    4)柔韧性

    存储过程和原始SQL更加"灵活"。您可以利用存储过程和SQL为奇怪的特定情况生成更快的查询,并且可以比使用和ORM更容易地利用本机DB功能。

    5)总体

    不要陷入选择ORM和使用存储过程的错误二分法中。您可以在同一个应用程序中同时使用这两种方法,而且您可能应该这样做。大批量操作应该放在存储过程或SQL(实际上可以由EF调用)中,而EF应该用于CRUD操作和大多数中间层的需要。也许您会选择使用SQL编写报告。我想这个故事的寓意和以前一样。使用正确的工具进行作业。但是,现在的ef非常好(从.NET 4.0开始)。花一些时间深入阅读和理解它,你可以轻松地创建一些惊人的高性能应用程序。

    编辑:EF5使用自动编译的LINQ查询简化了这一部分,但是对于真正的大容量的东西,您肯定需要测试和分析什么最适合您在现实世界中。


    存储过程:

    (++)

    • 非常灵活
    • 对SQL的完全控制
    • 可用的最高性能

    (-)

    • 需要SQL知识
    • 存储过程不受源代码管理
    • 在指定相同的表和字段名时,大量的"重复您自己"。在重命名一个数据库实体并在某个地方缺少对它的一些引用后,破坏应用程序的可能性很高。
    • 发展缓慢

    ORM:

    (+)

    • 快速发展
    • 数据访问代码现在受源代码控制
    • 您与数据库中的更改隔离开来。如果发生这种情况,您只需要在一个位置更新模型/映射。

    (-)

    • 性能可能更差
    • 没有或很少控制ORM产生的SQL(可能效率低下或更糟)。可能需要干预并用自定义存储过程替换它。这将导致代码混乱(代码中的一些LINQ、代码中的一些SQL和/或源代码控制之外的数据库)。
    • 因为任何抽象都可以产生"高层次"的开发人员,他们不知道它在引擎盖下是如何工作的。

    一般的折衷办法是在拥有很大的灵活性和大量的时间损失之间,而不是在你能做的事情上受到限制,而是让它很快完成。

    这个问题没有一般的答案。这是圣战的问题。还取决于手头的项目和您的需求。挑选最适合你的。


    您的问题基本上是O/RM与手写SQL

    使用ORM还是纯SQL?

    看看其他一些O/RM解决方案,L2S不是唯一的解决方案(NHibernate、ActiveRecord)

    http://en.wikipedia.org/wiki/list_object-relational_mapping_软件

    要解决具体问题:

  • 根据O/RM解决方案的质量,L2S非常擅长生成SQL
  • 一旦你摸索这个过程,使用O/RM通常会快得多。
  • 代码通常也更整洁,更易于维护。
  • 直接SQL当然可以让您获得更大的灵活性,但是大多数O/RM可以执行除最复杂的查询之外的所有操作。
  • 总的来说,我建议使用O/RM,灵活性损失是可以忽略的。

  • LinqtoSQL是一项非常简单的技术,大体上,它可以为后端生成非常好的查询。linq-to-ef计划取代它,但从历史上看,它的使用极其笨拙,生成的SQL质量也差得多。我不知道目前的情况,但微软承诺将L2S的所有优点迁移到L2EF,所以现在可能会更好。

    就我个人而言,我对ORM工具有着强烈的反感(详情请参阅我在这里的评论),因此我认为没有理由支持L2EF,因为L2S提供了我从数据访问层所期望的一切。事实上,我甚至认为L2S特性(如手工制作的映射和继承建模)添加了完全不必要的复杂性。但那只是我。;-)


    如果您所追求的是存储过程的功能和性能,以及实体框架等工具提供的快速开发,那么您可能需要考虑一种全新的方法。

    我用SQL+在一个小项目上进行了一次测试,它真的很特别。基本上,您可以向SQL例程添加相当于注释的内容,这些注释向代码生成器提供指令,然后根据实际的SQL例程构建一个非常好的面向对象类库。有点像反向的实体框架。

    输入参数成为输入对象的一部分,输出参数和结果集成为输出对象的一部分,服务组件提供方法调用。

    如果您希望使用存储过程,但仍然希望快速开发,那么您可能需要看看这些东西。