2013-07-09 46 views

回答

11

的IList

  • 双向关系:不被支持。 (因为是介绍,以保持孩子,这对孩子元素不能感知的顺序一个附加的索引列)
  • 有序:是
  • 类型:IList的
  • 重复:允许
  • 上的添加元素:将加载整个集合以获取索引列值。避免如果孩子的名单是巨大的。

  • 双向关系:支持
  • 有序:NO
  • 类型:IList的
  • 重复:允许
  • 上的添加元素:只有一个命中数据库。没有性能问题。

的ISet

  • 双向关系:支持
  • 有序:NO
  • 类型:ISet的(直到NHibernate的3。0它支持的接口从Iesi.Collections
  • 重复:NOT ALLOWED
  • 上的添加元素:整个集合将被载入到检查重复。避免如果孩子的名单是巨大的。

的ICollection可以作为孩子收集可以通过任何三个NHibernate的映射

NHibernate的食谱3.0具有使用每个集合的一个很好的解释的映射的类型,万一你碰巧遇到它。

+2

我会使用'ICollection '作为包'IList '暗示有一个命令和一个索引 – cremor

+1

您是否将IList扩展为不支持双向关系?我们将所有集合都暴露为IEnumerable作为属性和IList作为后台字段,并且我们没有双向关系问题。 – epitka

1

任何的IEnumerable意味着延迟执行,所以你要在查询中使用此当你的检索是要进行进一步的处理下游(过滤是最明显的情况下)。

如果情况并非如此,并且确实要确保不会多次枚举集合,则可以将其作为IList,ISet或ICollection进行提供。如果您希望确保收集可能有重复,则IList将更受欢迎,而当您希望确保该集合没有欺骗时(集合行为在我的经验中更有用)时,首选ISet。

这两个IList和ISet 都是 ICollections,它暴露了像Count这样的裸露骨骼集合行为。在一个NHib上下文中,你可能会在使用Iesi集合而不是.net HashSet的实现中看到这一点,但这可能与有一次没有.net HashSet的事实有关,然后NHib的能力存在滞后轻松使用它(但NHib 能够将ICollection映射到Iesi集)。

HTH

+1

“任何IEnumerable表示延迟执行”不正确。所有集合都是IEnumerable。如果您不需要修改集合,那么没有任何说法使用IEnumerable属性映射为set或bag。 – cremor

+1

@cremor。技术上是真实的,但这仍然是揭示IMO这样一个集合的主要原因。我把'手段'的措词改成了'暗示你想要的'。'* * * * * * * * * *重要的: - ) – Berryl

相关问题