ORM比较:首先是数据库还是类?

时间:2010-09-15 19:57:17

标签: .net nhibernate linq-to-sql subsonic-active-record subsonic-simplerepository

最近我一直在研究可用的基于.NET的ORM。我注意到每个人都会在一两个阵营中选址。在一个阵营中,首先创建数据库,ORM提供了一种更简单的方法来访问应用程序中的数据库。在第二个阵营中,对象模型首先存在,ORM有助于将对象模型保存在数据库中。

现在我不是要求或断言一个阵营是否比另一个更好。我当然可以看到每种设计方法的原因。令我感到沮丧的是,我最近阅读的所有教程和“入门”文档都没有出现并且在开头说“这个工具假设您从现有的数据库/对象模型开始”。对我来说,这对于你是否会使用一个ORM而不是另一个来说非常重要。

所以在做了一堆阅读并创建了几个“Hello World”项目之后,我已经在我所研究的ORM支持的工作流程上整理了一系列要点。任何有这些工具经验的人都可以告诉我,我是否做了任何不正确的陈述,或完全错过了任何非常重要的观点。具体来说,我真的想知道我对数据库模式或对象模型是否应该首先使用每个工具的假设都是正确的。

Linq To SQL

  • 数据库应该首先存在
  • 仅适用于SQL Server
  • DataContext类用于在类和数据库之间进行读/写
  • DataContext可以重新调用实际物理类,或者动态类型可以用于根据数据库模式自动创建类型。
  • 映射默认为映射表名到类名,属性名映射到列名
  • 可以通过嵌入在每个类中的属性来定制映射

Subsonic (Active Record)

  • 应首先创建数据库
  • 使用多种数据库技术
  • 使用T4模板从现有数据库模式自动生成类
  • 生成类后,与数据库的连接完全透明
    • 调用类构造函数自动创建数据库中的记录
    • 更改属性值会自动更新数据库。

Subsonic (Simple Repository)

  • 类结构应该首先
  • 使用多种数据库技术
  • 创建存储库类并将其连接到数据库
  • 在将类添加到存储库时,会自动创建和更新数据库模式
    • repo.Add<MyClass>(instance);
    • 存储库使用反射来创建/更新数据库架构
    • 每次创建一个表,并为每个属性创建一列

NHibernate

  • 可以先创建数据库或类结构
  • 使用多种数据库技术
  • 最终装配中的类归因于NHibernate映射设置,它将类和属性映射到表和列
  • 添加映射配置有两种方法
    • 嵌入在二进制文件<classname>.hbm.xml
    • 中的XML文件
    • 添加到代码中的属性
  • 支持高级映射配置,包括一对一,一对一,多对一,多对多,继承等......等等......

3 个答案:

答案 0 :(得分:2)

继续提出实体框架的评论:

Entity Framework (wikipedia also has some nicely structured information)

  • 支持代码优先,模型优先和数据库优先开发。首先是代码和模型的区别在于,首先在代码中首先编写实体类,而在模型中首先设计数据模型,然后基于它生成实体。
  • 基于元数据模型(EDMX)(虽然可以说代码中没有代码),它也定义了映射; EDMX是一个XML模型,包含数据库结构,实体结构和它们之间的映射,并由Visual Studio内置的设计器支持。在代码优先中,映射是在代码中而不是在EDMX中定义的。
  • 支持多种数据库技术(我使用过MySql和Oracle)。
  • 基于T4代码生成(在v4中),除了允许有趣的可扩展性场景之外,还可以生成:
    • 从特定于实体框架(EntityObject)的基类派生的实体
    • 完全不依赖实体框架的POCO实体
    • 自我跟踪实体。
  • 适用于RIA服务(Silverlight)。
  • 支持我认为的几乎所有关系类型,以及多种策略的继承(尽管其中一些可能存在一些问题)。
  • 非常好的支持Linq(Linq to Entities)。

还有我没有使用过的LLBLGen,但是根据我的一位同事的评论,它并没有表现得那么好。

我之前使用过NHibernate,虽然简单,但印象还是不错的;虽然当时它还没有现在那么成熟,但它仍然是一个非常好的图书馆。不确定我现在是否必须在NH和EF之间做出选择......我想我会选择EF,因为这是我过去一年左右一直在使用的东西,开发速度会更快(仅限我),但功能-wise NH可能稍好一些。

答案 1 :(得分:1)

老实说,任何半正式的ORM都可以同时处理数据库和代码优先设计。

您的问题中包含的所有ORM(包括EF 4和LLBLGen Pro 3)都可以做到,但可能存在不同程度的疼痛。例如,首先为LinqToSql执行代码实际上不是它打算做的,但我相信有一些开源项目,其中该功能被“拴在一起”。也就是说,基本上没有理由推荐LinqToSql,因为微软正在推动所有人转向实体框架。

目前,NHibernate可能拥有最好的整体代码第一个故事。由于他们都非常支持ORM,因此很难就ORM拥有最佳整体数据库第一个故事发表意见,并且特定用例并不是您应该根据自己的决定做出的。

根据它是否是一个好的ORM选择一个ORM。好的ORM首先支持数据库,并且首先支持代码。

答案 2 :(得分:1)