【问题标题】:Is Entity Framework Overkill for Web Applications?实体框架对 Web 应用程序来说是否矫枉过正?
【发布时间】:2011-04-14 04:43:57
【问题描述】:

假设我们正在为中小型企业开发电子商务 Web 应用程序。让我们进一步假设业务可能会随着时间的推移而扩展。换句话说,产品线通常会增长。

到目前为止,我已经使用 ADO.NET 和存储过程在 SqlHelper 类的帮助下开发了 n 层解决方案。对于更大的应用程序,我使用了 Enterprise Library (2.0)。

我想转向基于 ORM 的方法,并开始学习 LINQ 以及从 ASP.NET Web 窗体切换到 ASP.NET MVC。我不想使用 LINQ-to-SQL。 问题不在于是否需要 ORM,而是实体框架 ORM 对于这样的项目是否过大。如果手头的任务需要,我不介意学习曲线。

关于“矫枉过正”,我想知道:

  • EF 比具有正确技能的人手动编码查询更快
  • EF 导致不必要的代码膨胀
  • EF 不必要地屏蔽了开发人员查询的代码级详细信息
  • LINQ-to-Entities 适合这种规模的项目

事实上,如果有人认为 ORM 对于此类项目来说太过分了,我想听听原因。

【问题讨论】:

  • 不敢相信近距离投票 - 这显然是一个合法的问题。
  • @Irish:合法讨论,不是合法问题。 SO 不是讨论的地方。
  • @John,点了,但我不得不不同意这个特定的。我还需要知道是否存在将 EF 与我正在采用的其他技术集成的问题。将更新问题以反映这一点:-)
  • @Irish:如果您有具体问题,请提出具体问题 - 一个单独的问题。
  • @John,我已经删除了最后一次更新。我仍然坚持最初的问题是合法的 - 标题就是问题,我们可以讨论它的特殊性,直到奶牛回家;-)

标签: asp.net asp.net-mvc entity-framework orm


【解决方案1】:

EF 对于网络应用来说并不过分。

我不同意您引用的文章中的很多内容。我同意开发人员应该具备良好的 SQL 技能,但 ORMS 在更快地完成开发工作方面做得很好。

  • ORMS 的速度 - 他们正在 一直更好,他们让你 调用 SP 或将查询修改为 必要时获得最大速度。还有一些很棒的分析器可以监控 ORM 的性能,比如EFProf

  • 减慢编码过程 - 真的!!!一旦学会它就会加速 向上。

  • 需要了解 SQL 的开发人员 - 我同意。 然而,ORMS 尤其是 LINQ 语法通常允许开发人员编写更多 复杂的 SQL 比他们有的 他们自己的。

  • 开发人员已经编写了高效的查询 - REALLLYYYY!!!!只需询问 DBA 他/她的想法!我碰巧认为我这样做,但其他人也是如此。看到问题。 :-)

  • 代码膨胀 - 必须不同意,尤其是那些有 LINQ 的......它通常使代码更具可读性并经常减少行数。

  • 忘记 LINQ - 这艘船有 航行。 LINQ 摇滚!!!!随它去或 被抛在后面。它不仅仅用于 ORMS。它可以用于数组、对象、XML、文件、twitter 等等……了解 LINQ。

本文讨论了 MS 最新开发的一些灵感来自 Ruby on Rails。 ROR 里面有一个基于 Active Record 的 ORM .....

ORMS 很好。它们不必在任何地方和每次都使用,但它们很好,应该考虑。

【讨论】:

  • 我也会读一读。 90% 的所有场景的数据库访问是一个已解决的问题。您重新发明轮子并从您的客户/雇主那里窃取解决了同样的问题。 ayende.com/Blog/archive/2008/11/21/…
  • 同意!!最肯定不是矫枉过正。当然,您可以使用或不使用任何 ORM .. 仍然编写糟糕的 .net 代码/糟糕的 sql 查询。假设开发人员/开发团队的编程技能还不错,那么 EF 将是 .NET 解决方案的绝佳选择。无论是那个或NHibernate。 L2S 很棒(Stack Overflow 使用它作为他们的 ORM(我用这个词很轻))但它现在被 EF 取代了。就像 L2S 取代了 ADO.NET 一样。所以选择 EF 或 NHibernate。
  • L2S 未被取代。事实上,L2S 在 VS 2010 中得到了改进。只是范围比 EF 更有限。
  • 我同意你所说的一些观点,但事实并非如此:然而,ORMS 尤其是带有 LINQ 语法的 ORMS 通常允许开发人员编写比他们自己编写的更复杂的 SQL。 SQL 要求越复杂,就越难以让 linq 和 EF 按预期工作。 Linq 非常适合快速命中数据请求,并且比开发存储过程要快得多,但对于复杂的查询则不然。创建存储过程。
  • 我同意我的声明和你的@Clarence。 :-) 我遇到过不太了解 SQL 的开发人员,而 LINQ 确实使编写更复杂的 SQL 成为可能。但是,随着复杂性的增加,我发现如果您知道 SQL 并且正如您所说的在 LINQ 中更难做到,那么通常需要的 LINQ 是不值得付出努力的。我很少编写存储过程、视图等......因为包括 EF 在内的 ORMS 可以使用您自己的 SQL 并运行它以及像我经常使用的 dapper 这样的微型 ORMS。
【解决方案2】:

虽然这是一个一般性的答案,但要警惕任何包含这些 cmets 的意见:

“X 工具很臭,我用 Y 工具写,比 X 工具写得快。”

当然,说拉丁语的人的拉丁语说得更好。

【讨论】:

  • Buuuuut X 工具确实很臭!它永远无法与Y工具相提并论!!!!!!!这个大家都知道! :-)
  • 最好小心——这可以理解为讨论:-O
  • 稍后再开个愚蠢的玩笑……既然拉丁语已经死了,就没有拉丁语为母语的人了,所以,无论母语是什么,说拉丁语的人在其他语言中说得更好。
【解决方案3】:

EF 有一个学习曲线,但任何新事物都有。 EF 不是矫枉过正,但根据正在编写的任何系统,为正确的项目使用正确的技术。

【讨论】:

    【解决方案4】:

    看到这篇文章,我首先看到和不同意的是:

    我坚信现代网络 开发人员应该:

    •爱数据库。

    •编写高效的查询。

    •最小化代码。

    •设计不言自明的用户界面。

    •快速工作。

    我不确定有多少人关注 Web 开发,但在我看来,Web 开发人员应该专注于功能和业务规则。纯数据库和 SQL 代码永远不应该由我团队中的某个人来完成,因为他们编写业务功能代码会更有效率。

    这就是实体框架发挥作用的地方。它被认为是一种快速应用程序开发工具(与大多数其他 ORM 一样)。这些工具是专门构建的,可让您更多地关注如何满足用户需求,而不是关注编写查询的正确方法是什么。

    话虽如此,我还要说天真地使用该工具可能是危险的。当您使用实体框架时,您仍然必须认识到使用您请求的对象图的含义。

    这还不算大材小用,该工具使用起来非常简单易学。我认为“修复”实体框架比修复原始 SQL 查询和 ADO 事务集更容易。

    在较小的项目中,我的基本建议几乎总是使用某种类型的 ORM。在企业应用程序上,您必须更加小心,这完全取决于预算:-)。

    【讨论】:

    • 我希望我能像那样缩小我的注意力,但我可以做所有事情,从 CSS 设计、应用程序设计到​​数据访问! :)
    • 另请注意,这些“应该”陈述与 Web 开发人员真正需要做的事情无关 - 编写满足所提供业务要求的代码。
    【解决方案5】:

    如果使用得当并且您了解它的作用,ORM 会非常有用。如果您已经对数据库设计和查询有所了解,则绝对应该使用它。

    这篇文章的主要观点是,不必学习任何有关数据库设计和查询的知识以某种方式让您的生活变得更好的概念是一个谬误。我更喜欢代码和数据库之间的非常薄的抽象层 - 我觉得这让我更专注于良好的用户体验。

    我个人认为 EF 背后的媒体正在鼓励新程序员忽略一些必要的基础知识。我曾与他们中的一些人合作过,并认为他们对他们造成了伤害。

    当然,有些人会非常不同意。没问题!

    我知道开发人员一开始就喜欢它,但现在不喜欢了。但我也知道喜欢 EF 并对其发誓的开发人员。

    这些年来我一直在使用 EF、LINQ to SQL 和 NHibernate 等。

    最佳建议:试一试。得出你自己的结论。

    (披露:我是您引用的文章的作者)。

    【讨论】:

    • 我同意开发人员需要数据访问编码经验,我有,虽然 LINQ 对我来说是新的(从一开始就喜欢这个概念)。我看到了对 ORM 的需求,而 EF 很难被忽视。谢谢托尼的记录! :-)
    【解决方案6】:

    绝对不是矫枉过正。继续使用 EF。

    【讨论】:

      【解决方案7】:

      这实际上取决于数据模型的复杂性,而不是应用程序的类型。

      如果您有一个相对简单的数据模型,那么 EF 可能会大材小用(如果您还不知道的话)。 Linq-to-SQL 可能是更好的选择(学习曲线更少,尽管它也有限制,例如没有多对多映射)。

      如果您的数据模型更加规范化,而不仅仅是基于表,那么从长远来看,EF、nHibernate 或任何其他更高级的 ORM 肯定会有所回报。

      您链接到的文章似乎表明 ORM 通常是不好的,而不仅仅是 EF。当面对他的观点时,他似乎在某种程度上退缩了。似乎他试图通过发明有问题的观点来证明一个笼统的概念(新开发人员在进入高级框架之前必须学习低级编码,尤其是 SQL)。

      【讨论】:

      • 是的,当然可以。多对多需要一些创造性的查询,或向数据模型添加部分类功能。
      猜你喜欢
      • 1970-01-01
      • 2021-10-04
      • 2011-03-10
      • 2013-01-10
      • 1970-01-01
      • 2011-07-25
      • 1970-01-01
      • 2012-07-06
      • 2014-10-31
      相关资源
      最近更新 更多