在NHibernate中列出vs Set vs Bag

mrb*_*lah 105 nhibernate

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

Mic*_*uso 225

NHibernate语义:

  1. 清单:有序的实体集合,允许重复.IList在代码中使用.NET .索引列需要在NHibernate中映射.

  2. 设置:无序的唯一实体集合,不允许重复.用于Iesi.Collection.ISet代码(v4之前的NH)或System.Collections.Generic.ISet(NH v4 +).重写GetHashCodeEquals指出重复的业务定义很重要.可以通过定义orderby或通过定义产生SortedSet结果的比较器来进行排序.

  3. 行李:无序的实体列表,允许重复.ICollection<T>在代码中使用.NET .列表的索引列未映射,也不受NHibernate的尊重.


Jay*_*Jay 21

NHibernate中的所有这些对象与这些抽象数据类型(ADT)的其他实现完全相同.我很惊讶在线找到套装和包包是多么困难,因为名字对于其他东西有多么常见,所以我在这里列出了一些链接和描述.

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

一般规则是:

列表默认是有序的,如果您希望能够通过索引提取对象,或者您对for循环上的foreach循环有一种奇怪的喜好,请使用这些列表.您不需要像在链接列表中那样按顺序访问它们.此ADT允许重复.

请注意!虽然列表是按照BryanD在他的回答中提到的那样排序的,但是在执行HQL查询时,除非您通过命令指定顺序,否则绝对没有必要按照您期望从数据库中获得的顺序.正因为如此,有些人喜欢使用Set或Bags,所以它不会给出被命令的错觉.虽然我这样说,但大部分时间它们看起来都是按可见顺序排列的,因为它们按照NHibernate运行的查询中的顺序添加到列表中.

不是默认排序,你无法通过索引直接访问任何变量.默认情况下,集合是上述三个中唯一保持其对象唯一性的ADT.如果你有一个集合,如果你不需要包含重复项,这些都很棒.

从上面的链接可以看出,(或多字节)是一种类型的Set,它允许其中的对象与其他对象重复.通常不使用这些,因为列表排序可以忽略,因此被视为Bag.

关于如何在NHibernate中使用它们,根据您在此处选择的ADT,从数据库中提取的内容不同,它是您想要使用它的那个应该让您选择不同的ADT.

就个人而言,我使用集合来处理大多数事情,因为我通常要求子对象是唯一的,并且排序不是问题.虽然我将使用列表,其中我有一组对象,我希望按某种方式排序,例如时间,为了实现此顺序,我需要在HQL查询中手动设置"order by".

  • 列表中的更正 - 使用NHibernate映射文件中的列表将需要映射索引列.这样,列表将按照输入的确切顺序被拉出. (2认同)