3

我有一個領域模型是這樣的:NHibernate沒有使用鑑別符值來篩選子類型,爲什麼?

Class diagram

在映射,我使用所有LineItemOption亞型都存儲在一個單一的表和一個名爲「OptionType」表每層次結構用作鑑別器。此列未映射到某個屬性,並且對該域不可見。

// FluentNHibernate ClassMap for LineItemOption 
Map(lio => lio.Description); 
DiscriminateSubClassesOnColumn("OptionType"); 

// FluentNHibernate SubclassMap for ColorOption 
DiscriminatorValue("C") 

// FluentNHibernate SubclassMap for GenericOption 
DiscriminatorValue("O") 

我使用QueryOver API來提取的含有與含有特定描述的特定類型的LineItemOption一個LineItemOrder秒的列表。

private void AddColorRestrictionToQuery(
    IQueryOver<Order, Order> query, 
    string color) 
{ 
    query.JoinQueryOver<LineItem>(order => order.LineItems) 
     .JoinQueryOver<LineItemOption>(line => line.Options) 
     .Where(opt => opt.Description.IsLike(color)) 
     .Where(opt => opt is ColorOption);  // See below 
} 

這導致NHibernate的加入 「WHERE OptionType = MyNamespace.Entities.ColorOption」 到查詢中。它不是使用鑑別器值,而是使用完全限定的命名空間+類名稱。

爲什麼NHibernate使用類名而不是它的鑑別器?

+0

這可能與QueryOver是不可能的,我想這是一個單方向的關係,那就是你可以從ColorOption類型開始和向後工作? – Rippo

+0

@Rippo是的,它是單向的。無論如何,這是'訂單',而不是'LineItem'附加到它們。 –

+0

實際上,即使在雙向關係中,這也是不可能的,因爲您無法從ColorOption開始,除非您執行一些難看的切換 – Rippo

回答

5

我相信你想:

query.JoinQueryOver<LineItem>(order => order.LineItems) 
    .JoinQueryOver<LineItemOption>(line => line.Options) 
    .Where(opt => opt.Description.IsLike(color)) 
    .Where(opt => opt.GetType() == typeof(ColorOption)); 
相關問題