如何确保 NHibernate 创建 IList 代理?

Posted

技术标签:

【中文标题】如何确保 NHibernate 创建 IList 代理?【英文标题】:How can I ensure that NHibernate creates a IList proxy? 【发布时间】:2010-01-06 17:17:59 【问题描述】:

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

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

内部表示是IList&lt;WorkPost&gt;,如您所见,分配的值(这是来自 NHibernate 的延迟加载代理)然后被转换为正确的类型。这个实现让我觉得很糟糕,因为它依赖于 NHibernate 代理的内部表示。为了确保 NHibernate 将代理生成为列表,我使用 AsList() 声明为属性创建了流畅的映射:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于如何确保 NHibernate 创建 IList 代理?的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate QueryOver实体具有IList属性子属性

WCF+Nhibernate循环引用导致序列化的问题

NHibernate 多对多删除导致外键违规

NHibernate避免N + 1与深层次

映射一个简单的数组

在 NHibernate 中加载没有重复的多级集合