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

Eri*_*tas 9 .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可以重新调用实际物理类,或者动态类型可以用于根据数据库模式自动创建类型.
  • 映射默认为映射表名到类名,属性名到列名
  • 可以通过嵌入在每个类中的属性来定制映射

亚音速(活跃记录)

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

亚音速(简易存储库)

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

NHibernate的

  • 可以首先创建数据库或类结构
    • 可以创建映射以将新类结构与现有数据库匹配
    • 映射可用于自动生成数据库模式
  • 使用许多数据库技术
  • 最终程序集中的类归属于NHibernate映射设置,这些设置将类和属性映射到表和列
  • 添加映射配置有两种方法
    • XML文件嵌入二进制文件中, <classname>.hbm.xml
    • 添加到代码中的属性
  • 支持高级映射配置,包括一对一,一对一,多对一,多对多,继承等.等...

Ale*_*ven 2

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

实体框架 (维基百科也有一些结构良好的信息)

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

还有 LLBLGen,我没有使用过,但从我一位同事的评论来看,它并没有那么好。

我以前用过 NHibernate,虽然时间很短,但印象很好;尽管当时它不像现在那么成熟,但它仍然是一个非常好的图书馆。不确定我现在是否必须在 NH 和 EF 之间做出选择...我想我会选择 EF,因为这是我过去一年左右一直在使用的,并且开发会更快(仅对我来说),但功能-明智的NH可能会稍微好一些。