【发布时间】:2013-06-05 20:02:28
【问题描述】:
我有一个这样的域模型:
在映射中,我使用了一个按层次结构表的结构,其中所有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 来获取包含 LineItem 的 Orders 列表以及包含特定描述的特定类型的 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 使用类名而不是其鉴别器?
【问题讨论】:
-
QueryOver 可能无法做到这一点,我假设这是一个单向关系,即您可以从 ColorOption 类型开始并向后工作吗?
-
@Rippo 是的,它是单向的。无论如何,我感兴趣的是
Orders,而不是附在他们身上的LineItems。 -
实际上即使在双向关系中这也是不可能的,因为你不能从 ColorOption 开始,除非你执行一些丑陋的切换
标签: nhibernate fluent-nhibernate queryover