NHibernate没有使用鉴别器值来按子类型进行过滤,为什么?

时间:2013-06-05 20:02:29

标签: nhibernate fluent-nhibernate queryover

我有这样的域名模型:

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来获取包含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使用类名而不是其鉴别器?

1 个答案:

答案 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));