如何确保 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<WorkPost>
,如您所见,分配的值(这是来自 NHibernate 的延迟加载代理)然后被转换为正确的类型。这个实现让我觉得很糟糕,因为它依赖于 NHibernate 代理的内部表示。为了确保 NHibernate 将代理生成为列表,我使用 AsList()
声明为属性创建了流畅的映射:
HasMany(sheet => sheet.WorkPosts).KeyColumn("sheetId").AsList();
但这给了我比要求更多的东西,因为列表语义意味着排序再次向数据库模型添加一些额外的字段以及一些额外的查询(由于在提交时更新了排序字段),所以上面的“ AsList”必须去。
如何控制 NHibernate 在生成代理时应该返回什么类型的接口? (注意:更改属性上的IEnumerable
返回类型不是我正在寻找的答案:-))
【问题讨论】:
【参考方案1】:如果您不想要排序语义,您应该使用集合或袋子,具体取决于您是否允许重复元素。这是documentation on collections了解更多信息。
NHibernate 对集合的语义非常严格:
列表 (persistsIList
) 是一个允许重复的有序集合,并且可以使用整数进行索引;
映射(持久化IDictionary
)是一个无序集合,使用给定类型的唯一键进行索引;
一个集合(来自 Iesi.Collections 的持久化 ISet
,可能会使用框架版本 4 附带的 ISet
)是一个不允许重复的无序集合。
包(保留ICollection
或IList
,但不保证索引)是允许重复的无序集合。
【讨论】:
以上是关于如何确保 NHibernate 创建 IList 代理?的主要内容,如果未能解决你的问题,请参考以下文章