9

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

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

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

链接到 SQL

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

亚音速(活动记录)

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

亚音速(简单存储库)

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

休眠

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

3 回答 3

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 可能会稍微好一些。

于 2010-09-15T22:14:53.310 回答
1

我也在评估几个 ORM 工具。我写了一些关于我的经历的博客。也许它会帮助你

http://nileshgule.blogspot.com/2010/09/entity-framework-part-2-comparison.html

http://nileshgule.blogspot.com/2010/09/nhibernate-code-first-approach-with.html

http://nileshgule.blogspot.com/2010/08/entity-framework-hello-world.html

于 2010-09-17T17:32:58.740 回答
1

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

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

现在,NHibernate 可能拥有最好的整体代码优先故事。很难就哪个 ORM 拥有最好的整体数据库第一故事提出意见,因为他们都非常支持它,而且那个特定的用例并不是你真正应该根据你的决定做出决定的。

根据它是否是一个好的 ORM 来选择一个 ORM。好的 ORM 可以很好地支持数据库优先和代码优先。

于 2010-09-16T11:32:53.187 回答