2009-10-29 49 views
0

我遇到了一個問題,讓FluentNHibernate的HasMany <>映射行爲與我所期望的一樣。HasMany <MySubtype>映射返回超類型和所有後代?

我有一個類的層次結構Child是Parent的後代,使用table-per-hierarchy定義,由名爲'TYPE'的列中的類名進行區分。一個不相關的類Group包含一個Child元素的集合。

因此,集團類被定義爲:

public class Group 
{ 
    public virtual IList<Child> Children {get; protected set;} 

    public Group() 
    { 
     Children = new List<Children>(); 
    } 
} 

我在功能NHibernate地圖看起來是這樣的:

public class GroupMap : SubclassMap<Group> 
{ 
    public GroupMap() 
    { 
     HasMany<Child>(x => x.Children) 
      .Not.LazyLoad() 
      .Inverse() 
      .Cascade.All(); 
    } 
} 

我預計使用Group.Children會導致集合中Child類型的對象,但它返回包含Parent或Child類型對象的集合。

看看生成的SQL,select語句不會根據保存Parent和Child對象的表中的TYPE列進行區分。

更改我的映射:

public class GroupMap : SubclassMap<Group> 
{ 
    public GroupMap() 
    { 
     HasMany<Child>(x => x.Children) 
      .Inverse() 
      .Not.LazyLoad() 
      .Where("Type = 'Child'") 
      .Cascade.All(); 
    } 
} 

解決了這個問題,但它似乎是一個黑客給我。不應該聲明「的hasMany」推斷的結果應該是唯一的類型的孩子?

我是不是正確映射我的收藏?

+0

我認爲與每層次表您必須指定一個鑑別器 – mxmissile 2009-10-30 15:35:57

+0

我的流利地圖爲父/子層次包括DiscriminateSubClassesOnColumn (「Type」)聲明。從我在t中看到的所有內容他的數據庫,鑑別器在其他情況下正在被保存/讀取。 DiscriminatorPart SubClass 在我的IDE中顯示爲已棄用,所以我很確定沒有其他東西可以聲明。我發現詹姆斯格雷戈裏的評論指出使用類名作爲鑑別值的字符串鑑別符是默認行爲,這與我目前的經驗相符。 – 2009-10-30 18:25:53

回答

0

簡短的回答是,我使用FluentNHibernate映射搬走。

我回到使用普通的.hbm.xml映射,因此更加快樂