3
我有一個領域模型是這樣的:NHibernate沒有使用鑑別符值來篩選子類型,爲什麼?
在映射,我使用所有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
一個LineItem
Order
秒的列表。
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使用類名而不是它的鑑別器?
這可能與QueryOver是不可能的,我想這是一個單方向的關係,那就是你可以從ColorOption類型開始和向後工作? – Rippo
@Rippo是的,它是單向的。無論如何,這是'訂單',而不是'LineItem'附加到它們。 –
實際上,即使在雙向關係中,這也是不可能的,因爲您無法從ColorOption開始,除非您執行一些難看的切換 – Rippo