我有一个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时,只访问一个表/视图。
答案 0 :(得分:0)
好的,经过一些实验后我发现问题是由NHibernate的默认多态行为引起的......
添加:
Polymorphism.Explicit();
在基类(ParentModel)的映射中修复了问题......