5

在 NHibernate 的实体类中使用、IList或用于子对象的集合有什么区别?IE:IEnumerableISetICollection

public class Parent
{
    public virtual int IdParent { set; get; }

    public virtual IList<Child> Children { set; get; }
    // Or
    public virtual ISet<Child> Children { set; get; }
    // Or so on...
}
4

2 回答 2

14

列表

  • 双向关系:不支持。(因为引入了一个额外的索引列来维护子元素的顺序,子元素无法感知)
  • 已订购:是
  • 类型:IList
  • 重复:允许
  • 添加元素时:将加载整个集合以获取索引列值。如果孩子的名单很大,请避免。

  • 双向关系:支持
  • 已订购:否
  • 类型:IList
  • 重复:允许
  • 在添加元素时:仅对数据库进行一次点击。没有性能问题。

我设置

  • 双向关系:支持
  • 已订购:否
  • 类型:ISet(直到 NHibernate 3.0 支持该接口Iesi.Collections
  • 重复:不允许
  • 添加元素时:将加载整个集合以检查重复项。如果孩子的名单很大,请避免。

ICollection 可以用作子集合的类型,可以被三个 NHibernate 映射中的任何一个映射

Nhibernate Cookbook 3.0 对使用每个集合都有很好的解释,以防万一你碰巧遇到它。

于 2013-07-10T04:36:54.080 回答
1

任何 IEnumerable 都意味着延迟执行,因此当您的检索将受到下游进一步处理(过滤是最明显的场景)时,您希望在查询中使用它。

如果不是这种情况,并且您确实希望确保不会多次枚举集合,则可以将其作为 IList、ISet 或 ICollection 提供。当您想确保集合可能有重复项时,首选 IList,而当您想确保集合没有重复项时,首选 ISet(根据我的经验,集合行为更有用)。

IList 和 ISet都是ICollections,它公开了像 Count 这样的基本收集行为。在 NHib 上下文中,您可能会在使用 Iesi 集合而不是 .net HashSet 的实现中看到这一点,但这可能与曾经没有 .net HashSet 的事实有关,然后 NHib 的能力存在滞后轻松使用它(但 NHib能够将 ICollection 映射到 Iesi 集)。

高温高压

于 2013-07-10T00:17:27.730 回答