如何确保NHibernate创建IList代理?

时间:2010-01-06 17:17:59

标签: nhibernate lazy-loading proxy-classes

我的域对象上有一个属性,它显示为:

    public virtual IEnumerable<WorkPost> WorkPosts
    {
        get { return sheetPosts; }
        private set
        {
            Guard.AssertAssignableFrom(value, typeof (IList<WorkPost>));
            sheetPosts = value as IList<WorkPost>;
        }
    }

内部表示是IList<WorkPost>,正如您所看到的,分配的值(来自NHibernate的延迟加载代理)然后被转换为正确的类型。这个实现给了我一个不好的口味,因为它取决于NHibernate代理的内部表示。为了确保NHibernate生成代理作为List,我使用AsList()声明创建了属性的流畅映射:

        HasMany(sheet => sheet.WorkPosts).KeyColumn("sheetId").AsList();

但是这给了我一些比请求更多的东西,因为列表语义意味着排序再次向数据库模型添加一些额外的字段以及一些额外的查询(由于在提交时更新排序字段),所以上面的“ AsList“必须去。

如何控制NHibernate在生成代理时应该返回什么类型的接口? (注意:更改属性上的IEnumerable返回类型不是我正在寻找的答案: - ))

1 个答案:

答案 0 :(得分:1)

如果您不想要排序语义,则应使用集合或包,具体取决于您是否允许重复元素。以下是documentation on collections了解更多信息。

NHibernate对集合的语义非常严格:

  • 一个列表(persists IList)是一个有序集合,允许重复,可以用整数索引;
  • map(persists IDictionary)是一个无序集合,使用给定类型的唯一键进行索引;
  • 来自Iesi.Collections的一组(持久ISet,可能会使用框架版本4附带的ISet)是一个不允许重复的无序集合。
  • 一个包(持久ICollectionIList但不提供索引保证)是一个允许重复的无序集合。