2009-06-12 112 views
27

因此,一切工作都很好,基本鑑別器映射。我可以直接與實體A和B進行交互,沒有任何問題。流利的NHibernate實體不同子類類型的HasMany集合

public class BaseType {} 
public class EntityA : BaseType {} 
public class EntityB : BaseType {} 

這沒有在基本類型映射劇映射爲

DiscriminateSubClassesOnColumn<string>("Type") 
       .SubClass<BaseType>("A", m => { }) 
       .SubClass<BaseType>("B", m => { }); 

時出現的問題:在聚合,我們要集合映射到每個子類

使用像下面

映射
public class AggregateMap: BaseMap<Aggregate> 
{ 
     public AggregateMap() 
     { 
       HasMany<EntityA>(x => x.ACollection).AsSet().Cascade.All(); 
       HasMany<EntityB>(x => x.BCollection).AsSet().Cascade.All();    
     } 
} 

這些明顯不是完整的映射,但是它是描述我所嘗試的最小量。添加到ACollection和BCollection的項目在保存聚合時通過級聯正確保持。但是,在檢索彙總時,對類型歧視存在混淆。

我已經運行了很多不同的可能的解決方案,我不知道什麼都不起作用。我覺得我不應該在集合上提供一個where子句,但事情對我來說並不合適。

任何線索,將不勝感激。

+0

錯誤通過「關於類型的歧視混亂」,你的意思是,這兩個集返回所有的類型?不管他們的歧視? – 2009-06-12 07:44:38

+0

我現在已經離開工作,所以不記得確切的錯誤。像'無法加載EntityA類型的實體,因爲它不匹配指定的EntityB'。 我們使用HasMany映射中的字符串在Where子句中入侵,並通過鑑別器列手動過濾。我只是認爲這種類型會「流過」,而且決定將自動執行。 – berko 2009-06-12 07:58:56

+0

是的,要直接回答你的問題......我認爲它試圖加載所有類型,不管鑑別器如何。 – berko 2009-06-12 08:00:02

回答

1

您的映射看起來很奇怪,尤其是我覺得它應該這樣

DiscriminateSubClassesOnColumn<string>("Type") 
       .SubClass<EntityA>("A", m => { }) 
       .SubClass<EntityB>("B", m => { }); 

說了這麼多,似乎法計提折舊,你應該改爲定義以下(從Automapping Subclasses採取:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
    Id(x => x.Id); 
    Map(x => x.Name); 

    DiscriminateSubClassesOnColumn("type"); 
    } 
} 

public class ChildMap : SubclassMap<Child> 
{ 
    public ChildMap() 
    { 
    Map(x => x.AnotherProperty); 
    } 
} 

不知道這會雖然修復它,我還沒有遇到你的情景。

編輯:這個問題也提出了here,聽起來更像我