【问题标题】:Choosing Database and ORM for a .NET project为 .NET 项目选择数据库和 ORM
【发布时间】:2009-08-06 13:43:19
【问题描述】:

我正在开发一个在客户端使用 Silverlight 的 .NET 应用程序。现在我已经到了想在服务器端丢弃我的静态虚拟数据并添加一个数据库的地步。

对于数据库,我喜欢使用其中一个 ORM,我可以在其中简单地标记我的模型类,并为我构建数据库表。我之前用 Groovy 和 Grails 做了一些测试,认为 GORM 做得很顺利。在 .Net 中建立数据库的最佳方法是什么?

让我印象深刻的第一件事是使用 nHibernate。我对 nHibernate 一无所知,但我听到很多人热情地提到它。但后来我看到 ADO .Net 也是一个 ORM,它内置在框架中。nHibernate 是否胜过 ADO?与 LINQ 有什么关系?我看到它也被列为 ORM,但我认为 LINQ 更多的是用于查询部分?我可以通过 LINQ“定义”数据库吗?

欢迎任何 cmets 和建议。如果您对使用什么数据库有意见,我也很想听听。我认为 MS SQL Server 是最简单的选择?

【问题讨论】:

    标签: .net database linq nhibernate orm


    【解决方案1】:

    NHibernate 和 Silverlight:

    NHibernate 的贡献者之一,Ayende Rahien,最近在a blog post 上发布了关于 NHibernate 和 Silverlight 的信息:

    我有几个关于 NHibernate 和 Silverlight 的问题。这实际上是一件很容易回答的事情。

    不要尝试。他们相处不来。事实上,他们甚至不会相处。

    Silverlight 没有 System.Data.IDbConnection,您可以放心地假设它对 NHibernate 有点重要。

    因此,在 Silverlight 应用程序中运行 NHibernate,可能是为了访问本地数据库。但我不认为这是大多数人在询问 NHibernate 和 Silverlight 时真正想到的。他们想了解服务器上的 NHibernate 和客户端上的 Silverlight。

    这也很容易回答,它将像任何客户端/服务器系统一样工作。所有相同的规则都适用。

    因此,只要您不打算直接从 Silverlight 客户端使用 NHibernate,它就应该可以工作。

    NHibernate:

    NHibernate 是一个很棒的 ORM,但它的学习曲线相当陡峭,所以如果你选择 NHibernate,你应该准备好花一些时间来学习这个框架。如果您进行这项投资,您将获得 NHibernate 提供的灵活性和强大功能的回报。

    城堡活动记录:

    Castle ActiveRecord 是一个建立在 NHibernate 之上的框架,因此与 NHibernate 非常相似。它稍微减少了学习曲线,因为它增加了一些额外的抽象。顾名思义,它是为与 ActiveRecord 模式一起使用而构建的,并且包含一个基类,如果您不介意使用其 ActiveRecord 基类,它会为您提供相当多的功能。

    LINQ to SQL:

    LINQ to SQL 和 ADO.NET Entity Framework 是 .NET Framework 中包含的两个 ORM:s。 LINQ to SQL 是一个比 Entity Framework 更小、更简单的框架,但它有一些不错的特性,而且很容易上手。

    实体框架:

    Entity Framework 也很容易上手,但它在当前版本中存在一些相当大的问题,因为它仍处于版本 1 中。但是,Entity Framework 的下一个版本将改进并修复许多问题目前的缺点。

    框架的 LINQ 和架构生成:

    所有这些框架都支持使用 LINQ 作为查询语言。 LINQ to SQL 和 NHibernate 可以根据您的域类和映射为您生成架构。 Entity Framework 无法在 v1 中生成架构,但 v2 会添加该功能。

    【讨论】:

    • “现在我想在服务器端丢弃我的静态虚拟数据并添加一个数据库。” ——在我看来,这听起来像是他的 Silverlight 应用程序根本不需要更改,他只有一个服务器端返回 POCO。我想这可以澄清一下,因为我不确定 Silverlight 将如何影响服务器端 ORM 的决定(它可能会或可能不会?)。
    • 是的,我同意,但在谈到 NHibernate 和 Silverlight 时,可能值得一提。
    • 是的,让我澄清一下。在这个问题中提到 Silverlight 可能无关紧要。我的系统会像你提到的那样。客户端的 Silverlight - silverlight 代码后面的 C# - 通过 WCF 与服务器端通信 - 通常返回 POCO。数据库和 ORM 将仅在服务器端,因此不会被 Silverlight 的东西所触及。所以;不,Silverlight 不应该影响我对 ORM 的选择。
    • 从您的回答看来,我想使用 nHibernate。不过,我对提到的学习曲线有点害怕。想使用 LINQ 对 DB 进行查询,但如果我理解正确,nHibernate 和 LINQ 可以很好地结合在一起。所以;我可以用一些 nHibernate 的东西标记代码,它会自动创建我的数据库模式吗?但是数据库呢?我应该使用 MS SQL Server,还是 nHibernate(和 LINQ?)支持其他开箱即用的数据库?例如。 DB2?
    • NHibernate 支持一大堆数据库,如 DB2、MS SQL Server、Oracle、MySQL、SQLite、PostgreSQL 等。NHibernates Linq 的实现现在是 1.0 版,所以应该相当稳定。关于模式生成,是的,您创建了类,然后创建了一些元数据来告诉 NHibernate 这些类应该如何存储在 DB 中,然后 NHibernate 可以为您创建 DB。
    【解决方案2】:

    【讨论】:

    • 不,我没有……实际上从未听说过。会检查一下 - 谢谢!
    • 我可能误解了,但据我所知,.NET RIA Services 不是 ORM,因此不是我可以使用的东西,例如休眠。它似乎正在替换我项目中的 WCF 部分,将客户端和服务器端绑定在一起。正确的?话虽如此 - .NET RIA 服务看起来确实是我们应该进一步研究的东西!
    【解决方案3】:

    对于没有现有数据库的系统,我认为 NHibernate + FluentNHibernate 自动映射值得一试:

    http://wiki.fluentnhibernate.org/show/AutoMapping

    我以前没有使用过自动映射(我有一个要使用的架构),它们将是我研究的第一个想法。

    第二个选择,可能更可靠/经过验证的是 ActiveRecord:

    http://www.castleproject.org/activerecord/index.html

    同样,也没有使用过这个,但我相信你用属性标记你的实体来指定映射。

    两者的关键在于 NHibernate 可以将映射导出到自动创建表的数据库。

    我也不知道这对 Silverlight 有何影响。


    回复评论(在这里输入比评论更容易):

    NHibernate 支持的是获取项目中定义的映射文件并将它们导出到数据库的能力。这意味着您只需定义一次架构(您的应用程序)。

    现在,通常这些映射文件是 xml。这没什么大不了的,但显然还有改进的余地。

    FluentNHibernate 允许您 (a) 在代码中定义映射文件或 (b) 通过约定从您的实体自动创建映射文件。我使用方法(a)是因为我的数据库很糟糕,并且这个世界上没有任何约定,但是为了您的使用,我建议您使用(b),它是自动映射。上面的 wiki 链接提供了一个快速示例,说明它如何映射产品和货架。

    Active Record 的工作原理是让您不在 XML 中定义架构,而是将其定义为实体上的属性。不仅如此,它还实现了 RoR 使用的 ActiveRecord 模式(Entity.Save 等)。这个我没用过,但是用的很广泛。

    NHibernate 模式生成的一大优点是单元测试。我可以用几行代码在 SQL Lite 中创建一个测试数据库、导出模式、填充测试数据、运行测试并拆除它。它使集成测试变得容易,还有助于测试查询是否正常工作。

    我不知道这些是否是最好的解决方案,因为我真的只使用 NHibernate,所以无法评论 Linq2SQL 或 EF 或其他 ORM。

    【讨论】:

    • 正如对其他答案之一的评论,我认为此选择不会对 Silverlight 产生任何影响。感谢您提及 ActiveRecord 和 Fluent - 会检查一下。但我虽然 NHibernate 支持自动映射?不?那么你如何用 NHibernate 定义 db-schema 呢?您需要自己手动创建吗?
    【解决方案4】:

    如果您以前使用过 CodeSmith 并希望自动生成大量 LINQ to SQL 代码,您可能需要查看PLINQO

    其次,还有一个名为SubSonic 的工具,它也可以轻松创建一个LINQ to SQL 数据访问层。

    使用这些工具中的任何一个创建数据访问层都应该为您提供可以通过 Silverlight 用户界面访问的程序集。

    请注意,CodeSmith 本身确实要花钱,而 PLINQO 模板和 SubSonic 生成器可以免费使用。

    祝你的项目好运。

    【讨论】:

      【解决方案5】:

      已经提到了 SubSonic,但是向 Chris 道歉,我认为值得指出的是,SubSonic 可以从您的模型类中为您 generate a database。既然您专门询问了该功能。

      【讨论】:

        【解决方案6】:

        我绝对会使用ECO。它最多可免费提供 12 个课程,并提供许多有用的功能。它以模型为中心,并使用 OCL 在模型中导航。在我看来,OCL 比 SQL 或 LINQ 更容易使用。

        例如这个在 OCL 中构造的表达式:

        Person.allinstances.address->select(hasGeoPoint).streetname
        

        在这个例子中,有 2 个类,Person 和 Address。一个人可以有一个地址,一个地址可以有一个地理点(在这种情况下,这由一个布尔标志表示)和一个街道名称。上面的表达式从所有人的地址中过滤出具有地理点的所有街道名称。

        ECO 中的另一个重要特性是派生属性,可让您从其他属性计算值(这些属性又可以派生)。然后从第一个查询中缓存该值,以节省 CPU 时间。 ECO 也可以从现有数据库中使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-12
          • 1970-01-01
          • 2019-12-11
          相关资源
          最近更新 更多