在解决方案中nuget不支持任何项目 列表vs设置与NHibernate中的包



在解决方案中nuget不支持任何项目 (4)

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


Answer #1

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

有关更多详细信息,请查看以下内容: ListsSetsBags

一般规则是:

默认情况下, 列表是有序的,如果您希望能够通过其索引提取对象,或者对foreach循环上的for循环有奇怪的喜爱,可以使用这些列表 。 您不需要按照您在链接列表中所需的顺序访问它们。 这个ADT允许重复。

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

默认情况下, 集合 不是按顺序排列的,您不能直接通过索引访问任何变量。 默认情况下,集合是唯一保持上述三个对象唯一性的ADT 。 如果你有一个集合,如果你不需要包含重复的东西,这些都很棒。

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

关于NHibernate中如何使用这些内容,根据您在此选择的ADT,没有任何内容会从数据库中获取不同,您希望使用它来实现这一目标,从而让您选择不同的ADT。

就个人而言,我使用集合来处理大多数事情,因为我通常要求子对象是唯一的,而排序不是问题。 虽然我会使用列表,我有一组对象,我想按某种东西排序,例如时间,为了达到这个顺序,我需要在HQL查询中手动设置“order by”。


Answer #2

那么主要的区别在于列表对元素有一个隐式排序,由列表中的位置进行索引。 套件和行李通常也可以通过Comparator或order by子句进行“订购”,当这些物品从数据库中出来时可以应用。 就我个人而言,我从来没有使用过袋子......如果我知道我想要的数据是按顺序排列的,那么我使用List,否则我使用Set。


Answer #3

NHibernate语义:

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

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

  3. Bag:无序的实体列表,允许重复。 在代码中使用.NET ICollection<T> 。 该列表的索引列未被映射,并且不被NHibernate支持。


Answer #4

设置不允许你有重复的元素。 如果您将尝试添加一些新元素,它将比较(已使用Equals方法)已添加的元素中的每个元素,并且如果一个元素回退为true,则元素将不会添加