2010-01-06 17 views
1

我有一個屬性,它被暴露,因爲這我的域對象上:我如何確保NHibernate創建一個IList代理?

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的是集合的語義非常嚴格:

  • 列表(持續IList)是一個有序的集合,它允許重複,可與整數索引;
  • 一個映射(持續IDictionary)是一個無序的集合,它與給定類型的唯一鍵相關;
  • 一組(從Iesi.Collections持續ISet,可能會使用框架版本4自帶的ISet)是一個不允許重複的無序集合。
  • 一袋(堅持ICollectionIList,但沒有提供索引保證)是一個無序的集合,允許重複。
相關問題