通过中间的 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-one
和 one-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
");
}
我有一个场景需要通过中间 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-one
和 one-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
");
}