1

我的域对象上有一个属性,它公开如下:

    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 将代理生成为列表,我使用AsList()声明为属性创建了流畅的映射:

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

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

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

4

1 回答 1

1

如果您不想要排序语义,您应该使用集合或袋子,具体取决于您是否允许重复元素。这是有关集合的文档以获取更多信息。

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

  • 列表(persists IList)是允许重复的有序集合,并且可以用整数索引;
  • map (persists IDictionary) 是一个无序集合,使用给定类型的唯一键索引;
  • 一个集合(ISet来自 Iesi.Collections,可能会使用ISet框架版本 4 附带的集合)是一个不允许重复的无序集合。
  • 包(保留ICollectionIList不保证索引)是允许重复的无序集合。
于 2010-01-06T17:43:03.710 回答