【发布时间】:2010-10-14 00:39:36
【问题描述】:
与 ORM(NHibernate 或 Spring.Net)相比,我对 Dataset 有点困惑。据我了解,ORM 位于应用层和数据库层之间。它将为应用层生成 SQL 命令。这与 Dataset 的作用相同吗?数据集和 ORM 有什么区别?这两种方法的优缺点是什么?希望这里的专家能解释一下。
谢谢, 法赫鲁尔
【问题讨论】:
与 ORM(NHibernate 或 Spring.Net)相比,我对 Dataset 有点困惑。据我了解,ORM 位于应用层和数据库层之间。它将为应用层生成 SQL 命令。这与 Dataset 的作用相同吗?数据集和 ORM 有什么区别?这两种方法的优缺点是什么?希望这里的专家能解释一下。
谢谢, 法赫鲁尔
【问题讨论】:
ADO.NET 数据集 =
http://msdn.microsoft.com/en-us/library/zb0sdh0b(VS.80).aspx
ORM =
http://en.wikipedia.org/wiki/Object-relational_mapping (示例开发人员快递 XPO,DataObjects.NET)
【讨论】:
Dataset 类绝对不是 ORM; ORM 将关系数据映射到面向对象的表示。
不过,它可以被视为某种“工作单元”,因为它会跟踪必须删除/更新/插入的行。
【讨论】:
不,数据集不是 ORM。它们可能看起来像 orm,因为数据集将表映射到对象,就像 ORM 一样,主要区别在于它们映射到的对象。
数据集有自己的表和行对象类型,它们与数据库的结构非常相似。您正在对象中重建部分数据库的关系模型。将这些对象限制为类似于关系数据库的东西可以解决将数据库映射到对象模型中固有的一些问题。
ORM 将数据库中的表和行映射到您自己的对象模型中。您的对象模型的结构可以针对您的应用程序进行优化,而不是类似于关系数据库。 ORM 解决了将关系模型转换为对象模型的困难。
【讨论】:
它们之间有很大的不同,首先是它们所代表的编程模型:
正如其他人在我之前回答的那样,我认为查看 Microsoft 对 Dataset 的评价以及更好地了解 Wikipedia 对 ORM 的评价很重要,但我认为(这对我来说一开始是这样)更重要的是了解它们之间的区别模型。理解这一点不仅会澄清背后的选择,而且会更好地接近和理解工具本身。
可以这么说:
是一种模型,它倾向于尽可能接近(甚至根据需要)在内存结构中表示表格数据。因此很容易找到将概念实现为 Table、Columns、Relations 的实现,实际上模型集中在表结构上,因此面向对象不是基于数据本身。该模型可能有其自身的优势,但在某些情况下,管理起来可能很繁重,并且难以将概念应用于包含的数据。正如之前的回答所说,Dataset、let 或更好的实现会强制您准备(即使使用工具)所需的 SQL 指令来对数据执行操作。
是一个模型(正如 mendelt 在我之前所说的......)其中 Objects 直接映射到数据库对象,主要是表和视图(即使可以映射甚至函数和程序)。这通常以两种方式完成,使用描述映射的映射文件,或使用(在 .NET 或 Java 的情况下)代码属性。该模型基于代表数据的对象,因此可以像在普通程序中一样对它们进行面向对象,在某些情况下需要更多注意和谨慎,但通常情况下,当您对ORM 它可能是一个非常强大的工具!如果管理和设计不好,或者没有更好地理解,即使 ORM 也可能难以管理,因此了解技术很重要,但我可以根据我的经验说 ORM 是一个非常强大的工具。在 ORM 中,该工具主要负责生成在代码中执行操作所需的 SQL 指令,并且在更多情况下,ORM 具有中间语言(如 HQL)来对对象执行操作。
映射器是一种工具,它不像 ORM 那样制作东西,而是将手写 SQL 指令映射到对象模型。当需要手动编写 SQL 指令但想要设计一个应用程序对象模型来表示数据时,这种工具可能是一个更好的解决方案。 在这个“模型”中,对象被映射到指令并在映射文件中描述(通常是一个 Xml 文件,如 iBatis.Net 或 iBATIS (java) 所做的)。映射器允许您在 SQL 指令中定义细粒度规则。在这种情况下,很容易找到一些 ORM 概念,例如会话管理。
ORM 和 Mappers 可以应用一些非常有趣的设计模式,以同样的方式应用到表模型和在本例中的数据集可能并不那么容易。
首先请原谅我这个冗长的答案和我糟糕的英语,但对我来说,这样的答案让我过去很好地理解了这个模型之间以及实现之间的区别。
【讨论】:
DataSet 是一个 DTO,一个数据传输对象。 DataSet 本身无能为力。您可以使用 DataAdapter(使用的提供程序)来生成 sql 或调用预定义的查询,尽管它仍然没有做任何事情。
【讨论】: