【发布时间】: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