NHibernate ISet与IList

时间:2009-03-22 20:31:48

标签: c# nhibernate

在大多数NHiberate示例中,他们使用ISET而不是IList。我知道两个的基本差异,即 一个集是唯一的。但是,我不确定为什么他们在进行延迟加载时会在IList上使用ISet。

(Iesi.Collections.Generic)ISet对IList有什么好处?延迟加载时的特殊性。

2 个答案:

答案 0 :(得分:17)

我认为这主要归功于NHibernate的java遗产。

the FAQ entry on persistent collections。具体提到Java默认情况下如何包含更多集合C#,特别是它们映射到ISet。

我相信大多数样本使用它的原因主要是因为这在Java中更常见,并且样本是从Java移植的。 (有些样本使用set而不需要它成为一组......)

话虽如此,集合与列表之间存在明显差异。行为是不同的,因此有一些用例,其中集合的行为更合适。对于延迟加载,这允许您减少对加载的订单的限制,因此您可以加载更少的信息并保持接口合同到位。

答案 1 :(得分:7)

set接口仅表示生成的集合可以是:

  1. 测试会员资格
  2. 以任意顺序枚举(可能会改变)
  3. 列表界面表示第一个,但第二个表示更强,订单定义明确,除非有什么指示,否则不会改变。

    通过使用限制较少的合同(集合),您可以获得更多的自由(例如,您可以按任何顺序加载集合,如果此顺序不一致,则任何使用您的类的人都不应该关心)

    我在这里掩盖了这样一个事实:该集合进一步确保了它不能包含重复项(这是对实现者的约束)。但是,如果你需要存储这样的实例,那么集合将是不可接受的,所以这不再是一个问题,而是变成一个积极的。消费者的工作变得更加容易,因为他们不必担心存在重复的问题已经得到了保证。