通用QueryOver查询多个表

时间:2014-10-13 12:44:33

标签: c# .net nhibernate queryover

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

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

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

孩子的映射如下所示:

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

在db中,我有一个映射到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的查询(如预期的那样)

e.g。我试着跑:

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

我得到例外:

query did not return a unique result: 2 

因为正如我所说的那样,当我希望它只在父母/子女中搜索时,它会询问父母和子表(视图)......

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

1 个答案:

答案 0 :(得分:0)

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

添加:

Polymorphism.Explicit();

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