【发布时间】:2022-07-04 14:37:59
【问题描述】:
问题是当直接在基础模型上选择时,生成的 SQL 会在子类上执行左外选择。
基础模型。
public class Node
{
public virtual int ID {get;set;}
public virtual string Url {get;set;}
}
public class CMSPage : Node
{
public virtual string FieldA {get;set;}
public virtual string FieldB {get;set;}
}
public class Article : Node
{
public virtual string FieldC {get;set;}
public virtual string FieldD {get;set;}
}
我的映射是
public class NodeMap : ClassMap<Node>
{
Table("Nodes");
Id(x => x.ID, "Node_ID");
Map(x => x.Url);
}
public class CMSPageMap: SubclassMap<CMSPage>
{
Table("CMSPages");
Map(x => x.FieldA);
Map(x => x.FieldB);
}
public class ArticleMap: SubclassMap<Article>
{
Table("Articles");
Map(x => x.FieldC);
Map(x => x.FieldD);
}
使用 ICriteria 在节点上直接查询时
var store = session.CreateCriteria(typeof(Node));
store.Add(Restrictions.Eq("Url", filter.Url));
store.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("ID"), "ID")
.Add(Projections.Property("Url"), "Url"));
store.SetResultTransformer(new
AliasToBeanResultTransformer(typeof(Node)));
Node result = store.UniqueResult<Node>();
生成的sql是
SELECT this_.Node_ID as y0_, this_.Url as y7_ FROM Nodes this_
left outer join CMSPages this_1_
on this_.Node_ID = this_1_.Node_ID
left outer join Articles this_2_
on this_.Node_ID = this_2_.Node_ID
WHERE this_.Url = '/' /* @p0 - Url */
如何防止加入选择
我根据https://www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat尝试同时使用 Abstract 和 KeyColumn
【问题讨论】:
-
不幸的是,我在这里只看到 sql 作为一个选项。
标签: nhibernate fluent-nhibernate