通过中间的 Fluent NHibernate 映射 table

Fluent NHibernate mapping via middle table

我有一个场景需要通过中间 table 连接到 2 table 来完成映射(参见示例),目前它是通过转换为的公式实现的一个子查询,但我想使用连接来更有效地执行此操作。请帮忙

  Map(x => x.PropertyX).Formula(@"
               (SELECT C.ColumnX
                FROM   TableA A 
                       JOIN TableB B
                         ON A.Id = B.Id 
                       JOIN TableC C
                         ON C.Id = B.Id 
                WHERE  A.ColumnY = 898)");

您使用的解决方案可以转换为标准 ORM 用例。这里的本机或面向 object/entity 的解决方案是引入 many-to-oneone-to-many 映射。那会带来很多好处(延迟加载==仅在需要时,查询...)

小提示,我希望问题中的 FORMULA 片段只是一个例子,因为 A.Id = B.Id = C.Id 意味着 B 是不需要...

所以我们应该引入实体:

public class A
{
    public virtual B B { get; set; }
}
public class B
{
    public virtual IList<A> As { get; set; }  // not needed
    public virtual C C { get; set; }
}
public class C
{
    public virtual IList<B> Bs { get; set; }  // not needed
    public virtual string ColumnY { get; set; }
}

及其映射:

public AMap()
{
    References(x => x.B);
}
public BMap()
{
    References(x => x.C);
    HasMany(x => x.As);   // not needed
}
public CMap()
{
    HasMany(x => x.Bs);   // not needed
    Map(x => x.ColumnY);
}

现在我们可以通过很少的 JOIN 使用标准查询获得相同的结果。

以防万一

  • 我们想减少链条并且
  • 我们知道 公式内容总是只读...

我们可以创建一个虚拟实体 - 映射到视图:

public class A
{
    public virtual BView BView { get; set; }
}
public class BView
{
    public virtual string ColumnY { get; set; }
}

public AMap()
{
    References(x => x.BView)
}
public BMap()
{
    Table("viewName");
}

其中 viewName 表示数据库端的视图。万一我们不能引入视图,我们可以将它定义为内联的 SELECT

public BMap()
{
    Subselect(@"
        SELECT B.col1 as COL1,
               C.col2 as COL2,
               ..
        FROM B
         LEFT JOIN C
          ON B.CId = C.Id
        ");
}