【问题标题】:Inheritance Mapping Fluent NHibernate results in unnecessary joins继承映射 Fluent NHibernate 导致不必要的连接
【发布时间】: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


【解决方案1】:

子类映射的目的是为每个类层次结构创建一个表。意味着您有一张桌子可用于任何子班级。您可以在documentation 上找到有关 NHibernate 支持的所有类型继承的示例。

我认为您需要使用JoinedSubclassMap&lt;T&gt; 尝试“每个子类的表”策略。这两个子类表具有与超类表的主键关联,因此关系模型实际上是一对一的关联。文档 9.1.2。每个子类的表

如果您想保留SubclassMap&lt;T&gt;,您必须使用鉴别器。 9.1.3.每个子类的表,使用鉴别器。

【讨论】:

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