我有这样的域名模型:
在映射中,我使用的是每层次表结构,其中所有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来获取包含Order
LineItem
的{{1}}列表,其中LineItemOption
包含特定描述的特定类型。
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 :(得分:5)
我相信你想要:
query.JoinQueryOver<LineItem>(order => order.LineItems)
.JoinQueryOver<LineItemOption>(line => line.Options)
.Where(opt => opt.Description.IsLike(color))
.Where(opt => opt.GetType() == typeof(ColorOption));