【问题标题】:Generic QueryOver querying multiple tables通用 QueryOver 查询多个表
【发布时间】:2014-10-13 12:44:32
【问题描述】:

我有一个 Nhibernate 模型,它从基本模型继承属性但使用不同的表(视图):

public class ChildModel : ParentModel
{
     public virtual string ChildProperty1 {get; set;}
     ...
}

public class ParentModel
{
     public virtual int Id { get; set; }
     ... 
}

child 的映射如下所示:

public class ChildClassMap : ClassMap<ChildModel>
{
    public ChildClassMap()
    {
       Table(ParentViewEnhanced);
       //MapAllThePropertiesFromBaseviaStaticHelper
       Map(x => x.ChildProperty1).Column("Property1");
    }
}

在数据库中,我有一个映射到 ParentModel 的表 Parent 和一个从 Parent 中选择所有属性以及从其他表中选择一些附加属性的视图 ParentViewEnhanced。它看起来像这样:

create view ParentViewEnhanced
AS select p.*,
s.xyz,
....
FROM Parent LEFT JOIN subtable s ON (...)

有了这个,我想创建一个通用的 QueryOver,它应该根据某个值查询上述模型之一,所以我有:

T m_Alias = null; //T is generic parameter of ParentModel
IQueryOver<T, T> query = mySession.QueryOver(() => m_Alias);

其中 T 应该是 ChildModel 或 ParentModel。

问题是,无论我尝试从查询中获得什么样的结果,对两个表/视图都执行相同的查询:

NHibernate: Select ... from Parent where ...
NHibernate: Select ... from ParentViewEnhanced where ...

这只发生在我查询父表(Parent)时。当 T 设置为 ChildModel 类型时,只执行负责 ParentViewEnhanced 的查询(按预期)

例如我尝试运行:

query.Select(Projections.ProjectionList().Add(Projections.CountDistinct<T>(x => x.Id)))
                                                    .UnderlyingCriteria.UniqueResult<int>()

我得到了例外:

query did not return a unique result: 2 

因为正如我所说,当我期望它只在父/子中搜索时,它同时查询了父表和子表(视图)......

请注意,由于在子视图中存在左连接,模型使用复合键(连接会通过在 queryover 中设置一些属性来限制...)。除此之外,我不知道如何解决这个问题或它来自哪里。当我在任一模型上使用 Session.Get(..) 而不是 QueryOver 时,只能访问一个表/视图。

【问题讨论】:

    标签: c# .net nhibernate queryover


    【解决方案1】:

    好的,所以经过一些实验后,我发现问题是由 NHibernate 的默认多态行为引起的......

    添加:

    Polymorphism.Explicit();
    

    在基类(ParentModel)的映射中修复了问题...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多