【问题标题】:NHibernate is not using the discriminator value to filter by subtypes, why?NHibernate 不使用鉴别​​器值按子类型过滤,为什么?
【发布时间】: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 来获取包含 LineItemOrders 列表以及包含特定描述的特定类型的 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


【解决方案1】:

我相信你想要:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多