如何为 .net 选择对象关系映射

Posted

技术标签:

【中文标题】如何为 .net 选择对象关系映射【英文标题】:How to choose an object relational mapping for .net 【发布时间】:2009-09-24 10:06:53 【问题描述】:

(这必须是一个常见问题解答,所以我希望它作为重复关闭,但是我找不到包含 issues 等的良好 overview 的问题.)

在为 .net 系统选择 ORM 时应该考虑什么

如何由 .net 系统常用的 ORM解决上述问题。

(当我对 .net 问题说“考虑使用 ORM”时,我应该在答案中链接到女巫堆栈溢出问题)

是否希望提供新的答案并获得赏金?

【问题讨论】:

c2.com/cgi/wiki?ObjectRelationalToolComparisonDotNet 【参考方案1】:

这是我一直在向人们提出的关于选择 .NET ORM 的主要问题/答案:

NHibernate, Entity Framework, active records or linq2sql

我在我的答案中放了一堆“重复”类型的问题。因此,您可以从各种不同的角度进行大量阅读。

我也会尝试回答您的具体问题:

什么时候有人应该考虑 为 .net 系统选择 ORM?

您要确保它适用于 你的数据库。如果你的数据库 设计是最先进的 15 年 以前,许多较小和/或不太成熟的 ORM 不能在你缺乏的情况下工作 键、奇怪的关系等。

您要确保它适用于 您的数据库供应商。 SQL 服务器 支持几乎总是 可用,但其他数据库可能或 各种 ORM 可能不支持 (mysql好像是第二多的 普遍支持的数据库)。

如果要生成数据库 根据您的 .NET 类,您需要 以确保您的 ORM 支持这一点。

如果你想要性能,我猜你 远离糟糕的表现 那些,但那些永远不会 前 5 名,所以只要你去 有一些主流的 ORM 街头信誉,你可能没问题 在这里。

您需要确保它具有您需要支持的功能:http://ayende.com/Blog/archive/2006/05/12/25ReasonsNotToWriteYourOwnObjectRelationalMapper.aspx

考虑供应商锁定以及如何锁定 很容易你可能会也可能不会 逃避它(对于数据库 供应商和 ORM 供应商)。

考虑一下你想花多少钱。

考虑你想要的代码 一代。

考虑单元测试需要什么 支持。

考虑你想要多少时间 花研究各种 选项。

考虑存在的社区 围绕 ORM。

有很多事情要记住。我敢肯定我能想到更多。最后,其中很多都是情境性的,您需要自己决定什么对您和您的项目最有利。

ORM 如何解决上述问题 .net 常用的 系统。

据我所知,唯一能满足 .NET 项目可能拥有的几乎所有需求的 .NET ORM(不包括更晦涩的数据库供应商)是 NHibernate。它已经在许多不同场景中使用大量“遗留”数据库进行了测试。

【讨论】:

【参考方案2】:

ORM Battle 一个致力于分析和比较各种.NET ORM(对象关系映射)产品的完整网站!

但请记住,即使是 ORMBattle 网站也只比较了大约 7 或 8 个 ORM(尽管它确实比较了那些,但似乎比较彻底,但请参阅下面的免责声明)。

根据SharpToolBox website,大约有 40 个 ORM 可用! ORM 产品列表及其在 SharpToolBox 网站上的描述应该为您提供一个良好的开端。看这里: SharpToolBox Search Results for Object-Relational Mapping

考虑到几乎每个开发人员以及每个应用程序的数据访问需求都可能有所不同,因此很难在所有开发人员之间找到一个完整的比较。这可能是存在超过 40 种不同 ORM 产品的原因,因为在 ORM 的世界中没有“一刀切”。

另外,请记住,ORM 产品之间的任何比较都可能存在“缺陷”,因为您不能始终确定不同 ORM 产品的各种功能是为完全相同的目的而设计的。 AJ 对此答案的评论链接到 Ayende Rahien 的 blog post,当 ORMBattle 将 NHibernate 与其他 ORM 进行比较时,他准确地描述了这种现象。

我认为最好的方法是查看基准测试并阅读每个 ORM 的描述,但不要从字面上理解这些内容,而是根据您自己的应用程序应该做什么来解释这些数字。例如,如果您的应用程序主要一次读取和写入一个数据库记录,那么您可能会使用与需要批量处理数据库记录的应用程序完全不同的 ORM 产品。

【讨论】:

ORM Battle 所做分析的实用性备受争议……值得一读:ayende.com/Blog/archive/2009/08/15/… @AJ - 有趣的文章。我同意(任何东西的)基准可能会产生误导。这就是为什么每个寻找 ORM 工具的人都应该进行自己的研究,因为每个人(以及他们的需求)都不同。基准通常可以像统计数据一样,我们知道它们有多大用处! ;) (quotegarden.com/statistics.html) 这就是为什么有很大的常见问题解答部分:) 见ormbattle.net/index.php/faqs.html 我可以补充一下为什么现在只有 8 种产品:很少有商业供应商简单地要求我们删除他们的结果。我认为这根本不是很有趣 - 参见例如ormbattle.net/index.php/blog/… 我们会添加其他工具,如果它们支持 LINQ,但似乎没有更多这样的候选者。最后,我们邀请所有人(无论是否支持 LINQ)——测试套件是完全开源的。【参考方案3】:

我不是 .net 开发人员,但您应该查看 nHibernate。它是最先进的 Java ORM 的 .net 版本。我相信它也是 .net 的一个很好的解决方案,因为 ist 使映射对象非常容易,但仍然足够强大,可以将对象映射到几乎任何类型的 sql 模式。

【讨论】:

【参考方案4】:

在 NHibernate 或实体框架之间进行选择。 NHibernate 更具可扩展性,并且通常功能更丰富。 Entity Framework 工作得更好,更易于使用丰富的功能集。

两个框架都很棒,Entity Framework 比 NHibernate 有一个很大的优势:开始工作要容易得多,启动阶段可能相当困难。 EF 在这方面做得更好。然而,在某些领域 NHibernate 更胜一筹,例如在扩展框架时,NHibernate 提供了更多选择

最后,接听您的电话。两者中的任何一个都绝对不会让您失望。

【讨论】:

以上是关于如何为 .net 选择对象关系映射的主要内容,如果未能解决你的问题,请参考以下文章

EF 4.1 复杂关系的实体映射

如何为连接表中的其他属性创建多对多 Hibernate 映射?

持久化和对象关系映射

如何用 JPA/Hibernate 映射 XMLType

Java之旅hibernate——基本关系映射

hibenate考试题