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

NHibernate没有使用鉴别器值按子类型过滤,为什么?,nhibernate,fluent-nhibernate,queryover,Nhibernate,Fluent Nhibernate,Queryover,我有这样一个域模型: 在映射中,我使用每个层次结构的表,其中所有lineitempoption子类型都存储在一个表中,命名的“OptionType”用作鉴别器。此列未映射到属性,并且对域不可见 // FluentNHibernate ClassMap for LineItemOption Map(lio => lio.Description); DiscriminateSubClassesOnColumn("OptionType"); // FluentNHibernate Subcl

我有这样一个域模型:

在映射中,我使用每个层次结构的表,其中所有
lineitempoption
子类型都存储在一个表中,命名的“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获取一个包含
LineItem
Order
列表,该列表带有一个包含特定描述的特定类型的
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
}
private void AddColorRestrictionToQuery(
IQueryOver查询,
字符串颜色)
{
query.JoinQueryOver(order=>order.LineItems)
.JoinQueryOver(line=>line.Options)
.Where(opt=>opt.Description.IsLike(颜色))
.Where(opt=>opt是ColorOption);//见下文
}
这将导致NHibernate向查询中添加“WHERE OptionType=MyNamespace.Entities.ColorOption”。它似乎没有使用鉴别器值,而是使用完全限定的名称空间+类名

为什么NHibernate使用类名而不是其鉴别器?

我相信您希望:

query.JoinQueryOver<LineItem>(order => order.LineItems)
     .JoinQueryOver<LineItemOption>(line => line.Options)
     .Where(opt => opt.Description.IsLike(color))
     .Where(opt => opt.GetType() == typeof(ColorOption));
query.JoinQueryOver(order=>order.LineItems)
.JoinQueryOver(line=>line.Options)
.Where(opt=>opt.Description.IsLike(颜色))
其中(opt=>opt.GetType()==typeof(ColorOption));

QueryOver可能无法做到这一点,我假设这是一种单向关系,也就是说,您可以从ColorOption类型开始向后工作吗?@Rippo是的,它是单向的。无论如何,我感兴趣的是
顺序
s,而不是附加到它们的
行项
s。实际上,即使在双向关系中,这也是不可能的,因为你不能从颜色选项开始,除非你执行一些丑陋的切换