【问题标题】:Which ORM should I use instead of Linq to Sql?我应该使用哪个 ORM 而不是 Linq to Sql?
【发布时间】:2009-11-04 21:58:25
【问题描述】:

我正在开发一个 CMS 作为我的爱好项目。因为我没有为此付费,所以时间不是很重要,我渴望制作一个架构良好的系统。

我有一组负责主要逻辑的业务类,它们通过接口从数据库中获取数据,并且可以从配置中设置数据提供者(应该实现接口)。

目前我使用 LINQ to SQL 作为我的数据访问层,但是我对这个主题的阅读越多,我就越相信我应该使用更高级的 ORM,因为 LINQ to SQL 不支持某些东西对应用程序的整体性能非常有利。例如,缓存和持久性。 (例如,我读到 NHibernate 仅在必要时咨询数据库,否则它只是从其缓存中获取数据。 - 这很好,因为平均而言,一个网站几天不会获得新内容,所以而不是在每次请求时都从数据库中读取会浪费性能,从缓存中提供服务就可以了。)

我正在考虑一些选择,想知道我应该怎么做。

  1. 为我的业务类编写我自己的持久性逻辑,并继续使用 LINQ to SQL。
  2. 直接使用 NHibernate,或通过 Castle ActiveRecord 或 Fluent NHibernate 使用
  3. 使用其他 ORM

我最喜欢的选择是第二个,因为 NHibernate 比我需要的更健壮,而 ActiveRecord 似乎隐藏了大部分复杂性。 (顺便说一句,我也打算用温莎城堡。)

唯一的问题是,我找不到有关这些工具性能的任何信息。我花了几个小时在谷歌上搜索(和 binging(我也在查看这个网站)),找到了很多文章和博客文章,但没有一篇提到性能。

这会比当前的解决方案更好,还是我应该为任务使用完全不同的东西?

提前致谢!

【问题讨论】:

    标签: c# .net orm


    【解决方案1】:

    Linq to SQL 很不错(如果您不会使用除 SQL Server 之外的任何东西)。不要打扰 Linq to Entities (EF)。它已经坏了(远未成熟)——在很多层面上。

    我自己会选择 NHibernate - 出色的实体映射和多数据库平台支持。以及一个久经考验的 ORM。

    【讨论】:

    • 带有 .NET 4 的 EF v4(2010 年 3 月发布)将弥补 EF1 的许多缺点 - 绝对值得一看
    • 谢谢!那么 ActiveRecord 或 Fluent NHibernate 呢?我应该使用那些让 NHibernate 更容易一些吗?
    • Fluent NHibernate 如果您对映射文件很感兴趣,那是很好的选择。当我学习 nhibernate 时,我没有为 xml 模式放入 XSD 文件。在我开始使用 XSD 文件之后,我对 XML 真的没有太多麻烦。话虽如此。 Fluent NHibernate 真的很可爱,你应该看看它。话虽如此,Fluent NHibernate 是另一个需要学习的东西。如果您最终在使用 nhibernate 的法线映射时遇到问题,请使用 fluent。
    • 我不太喜欢基于 xml 的映射,因为它不会在出现问题时抛出编译时错误。
    • 关于基于 xml 的映射,这是 EF v4.0 擅长的另一个领域,因为它为其 xml 映射文件提供了自定义编译器。除此之外,不要低估将映射放入 xml 文件的价值。如果您采用流利的方法,重新配置的唯一方法是重新编译和重新部署。这消除了通过配置更改快速修复生产环境的巨大机会,而无需开发人员修复代码错误并重新部署。
    【解决方案2】:

    我会推荐 Entity Framework v4.0。与第一次尝试使用 EF v1.0 的 ORM 失败的失败不同,.NET 4.0 的版本确实令人惊叹。 Microsoft 在各个层面上都改进了 EF,并直接响应了许多主要 ORM 社区支持者的意见。我通过电子邮件与 Microsoft 直接就 EF 的几个问题提出了意见,包括生成的 SQL、n-Tier 故事和可视化设计器的效率和有效性。

    新的 EF 是一个可靠的 ORM,它为丰富的可视化设计器提供了完整的 OOB 故事,具有可自定义的代码生成、高效的 SQL 生成、多层可移植类型、POCO 样式实现、代码之间非常丰富的映射、概念模型和数据库架构等。我曾经是 nHibernate 的大力支持者和 EF 的强烈反对者,但自从我开始使用 VS2010/.NET 4.0 Beta 2 以来,我的看法发生了变化。我强烈建议使用 EF v4.0 如果您正在.NET 平台上工作。

    【讨论】:

    • 是的,当 .NET 4 成为最终版本时,我会考虑 EF v4。在那之前,.NET 3.5 中的 EF 简直太荒谬了。
    • 很高兴听到这个消息,刚刚完成了一个使用 EF 1.0 的小项目,遇到了很多令人头疼的问题。
    • @Venemo:如果你同时需要一些东西,我会推荐 nHibernate。它是一个丰富、成熟的 ORM。它只是缺乏视觉设计部门,并且缺乏 LINQ 支持。
    • 谢谢!反正我不是视觉设计师的粉丝。
    • 为什么投反对票?确实应该有一条规则,如果你投反对票,你必须评论为什么...... >.>
    【解决方案3】:

    我会说 NHibernate + FluentNhibernate 会让您快速启动并运行。 FluentNhibernate 最棒的地方在于,您只需几行即可完成设置,它会自动为您将对象映射到数据库。

    如果您想要在配置上稍微轻一些的东西,您可能需要查看Subsonic

    【讨论】:

    • 说到 Fluent NHibernate,你对 Castle ActiveRecord 有什么看法?
    • Castle ActiveRecord 很好,但我认为 fluent 比它有一些优势。首先是您可以使用约定来设置映射。其次,您可以映射您的对象,而无需对您的类文件进行任何更改。使用活动记录,您必须使用我觉得有点污染您的对象模型的属性。
    • 这确实为我解答了一些问题。非常感谢!
    【解决方案4】:

    你见过S#arpArchitecture吗? 它是一个基于 NHibernate 和 ASP.NET MVC 的框架,您可以在其上构建您的应用程序。

    好吧,如果你打算从头开始构建所有东西(也许是为了学习架构),你可以看看 S#arpArchitecture 的源代码以获得一些灵感。

    【讨论】:

    • 感谢您的回答! S#arpArchitecture 看起来很有希望,但是我的项目没有使用 ASP.NET MVC,因为它的逻辑与 MVC 模式有很大的不同。
    【解决方案5】:

    我同意你选择第二个选项。不是因为我知道这种情况下的性能更好,而是因为你说你想要一个架构良好的系统。如果您使用 LINQ to SQL,您将面临的问题是您将使用 LINQ 拖放生成的类在很大程度上取决于您的数据库架构和表结构。每当您对表结构进行更改时,您都必须重新生成 LINQ 类。从良好架构的角度来看,这是不可取的。您应该考虑将 NHibernate 与 asp.net mvc 一起使用。 NHibernates 为您提供了通过 xml 文件将业务对象属性与数据库表字段映射的能力。这增加了一个额外的抽象层,您的业务实体不直接依赖于您的表结构。在 codeplex 上有一个使用 NHibernates 的好项目。这是该项目的网址 http://jscportal.codeplex.com/ 。这是一个使用 asp.net mvc 和 NHibernates 构建的非常干净的 CMS 门户。此项目还将让您了解为您的应用程序进行良好设计的想法。万事如意!

    【讨论】:

    • 我喜欢 MVC 的想法,但我的这个项目是基于不同的。不过,我肯定会查看 jscportal。谢谢你的回答!
    【解决方案6】:

    我的投票是,在走 ORM 路线之前,还要检查一个成熟的 OODBMS。

    来自 Versant 的db4Objects 绝对值得一看,它速度快、易于使用且非常成熟。

    编辑:注意,db4Objects 也支持 Linq。

    【讨论】:

    • OO DBMS 被高估了。如果速度很快,则在涉及 OO DBMS 解决方案时通常不能很好地扩展,并且在对超过 5 个左右的链接实体进行交叉查询时会停止。
    • 您真的尝试过 db4O 吗?我想你会非常惊喜,我知道我是。
    • 不,平心而论,我没有。以前看过它们,对我来说总是很流行。在复杂查询、JOINS 和子查询的性能方面,我看不到 OO DBMS 如何与适当的 RDMBS 竞争。如果我有空闲时间,我可能会看看。或不。 ;-)
    • 需要注意的是,OODBMS 与 RDBMS 是一种非常不同的动物,因为它是面向对象的,您通常不需要像您想要的那样在任何地方进行联接和子查询在传统的 RDBMS 中,对象模型就是模式……一个好的(业务应用程序)对象模型通常没有那么深的层次结构。我并不是说这是一种侮辱,但实际上,在公开将其视为时尚或被高估之前,您不应该粗略地看一眼事物,Versant 已经为此工作了很长时间。
    【解决方案7】:

    因为这是一个用于学习目的的项目,所以使用 Nhibernate 确实值得努力学习 :)

    【讨论】:

      【解决方案8】:

      这个问题已经被问过很多次了:

      NHibernate, Entity Framework, active records or linq2sql

      【讨论】:

      • 感谢您的回答!但是,如果您在发布答案之前阅读了该问题,您就会知道我已经搜索过 Stack Overflow,并且我认为这些主题虽然很有帮助,但不适用于我的特定项目。
      • 下一次,在您的问题中提供您已阅读内容的链接。在您的问题中,很少有以前没有被问过的独特和新的问题。老实说,我不明白为什么你的情况是独一无二的。你不好暗示我没有读过这个问题。我读了很多遍。
      • 对不起!下一次,我会更加小心。谢谢你的回答!
      【解决方案9】:

      LLBLGen Pro 简直是最好的

      【讨论】:

        猜你喜欢
        • 2010-09-10
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 2012-06-23
        • 2012-06-12
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        相关资源
        最近更新 更多