清单vs设置与袋在NHibernate

NHibernate映射文件中的列表,集合和包有什么区别? 每个与.NET集合有什么关系?

NHibernate的语义:

  1. 列表:订购实体集合,允许重复。 在代码中使用.NET IList 。 索引列将需要在NHibernate中映射。

  2. 设置:唯一实体的无序集合,不允许重复。 在代码中使用Iesi.Collection.ISet (v4之前的NH)或System.Collections.Generic.ISet (NH v4 +)。 重写GetHashCodeEquals来表示重复的业务定义是很重要的。 可以通过定义orderby或通过定义导致SortedSet结果的比较器来进行sorting。

  3. Bag:无序的实体列表,允许重复。 在代码中使用.NET ICollection<T> 。 列表的索引列没有被映射,NHibernate没有遵守。

NHibernate中的所有这些对象都与这些抽象数据types(ADT)的其他实现完全相同。 我很惊讶在网上find套装和手袋有多困难,因为这些名字对于其他的东西有多常见,所以我在这里列出了一些链接和描述。

有关更多详细信息,请查看以下内容: 列表 , 集合和包

一般规则是:

列表默认是按顺序排列的,如果你希望能够通过它的索引拉出一个对象,或者你对foreach循环上的循环有一个奇怪的喜好,那就使用它们。 您不需要像在链接列表中那样按顺序访问它们。 这个ADT允许重复。

请注意! 虽然列表按照BryanD的回答中提到的顺序排列, 但绝对没有任何说法,除非您通过命令指定顺序,否则在执行HQL查询时,必须按照您希望从数据库中获得的顺序执行。 正因为如此,有些人喜欢用Set或Bags,所以不会给人以命令的幻觉。 虽然我这样说,但是大多数情况下,它们看起来都是按照可见的顺序排列的,因为它们是以在NHibernate运行的查询中find的顺序添加到列表中的。

默认情况下, 集合 并不是按顺序排列的,你不能直接通过索引访问任何variables。 默认情况下,集合是唯一保持其对象唯一性的三个ADT 。 如果你有一个集合,如果你不需要包含重复的话,这是非常好的。

从上面的链接可以看出, Bags (或者Multisets )是一种允许其中的对象成为其他对象的副本的Settypes。 这些通常不被使用,因为列表sorting可以被忽略,因此被视为一个Bag。

关于如何在NHibernate中使用,根据你在这里select的ADT,从数据库中不会有任何不同的东西,这是你想要使用它的东西,应该让你select不同的ADT。

就个人而言,我使用集合的大部分事情,因为我通常要求子对象是唯一的,订购不是一个问题。 虽然我会使用列表,我有一组对象,我想要的东西,例如时间,以实现这个顺序,我需要手动设置“顺序”在HQL查询。

那么主要的区别在于列表对元素有一个隐式的sorting,按列表中的位置进行索引。 套件和行李也可以通过一个比较器或一个订单旁边的条款来“订购”,这些条款在数据库出来时使用。 就个人而言,我从来没有使用过包…如果我知道我想要的数据是按顺序排列的,那么我使用List,否则我使用Set。

设置不允许你有重复的元素。 如果你想添加一个新的元素,它将会比较(使用Equals方法)已经存在的元素和添加的元素,如果一个元素回退为true,元素将不会被添加