我目前正试图让(流畅的)NHibernate将对象映射到我们的遗留数据库模式。涉及三个表。
检索信息的SQL查询如下所示:
SELECT z.ID, z.ZANR, e.TDTEXT
FROM PUB.table_a z
JOIN PUB.table_b t ON (t.TDKEY = 602)
JOIN PUB.table_c e ON (e.ID = t.ID AND e.TDNR = z.ZANR)
WHERE z.ZANR = 1;
主要问题是如何在映射中指定这两个连接条件。
表a的实体如下所示:
public class EntityA
{
public virtual long Id { get; set; }
public virtual int Number { get; set; }
public virtual string Name { get; set; }
}
名称应映射到列table_c.TDTEXT。
到目前为止我的映射是:
public class EntityAMap : ClassMap<EntityA>
{
public EntityAMap()
{
Table("PUB.table_a");
Id(x => x.Id).Column("ID");
Map(x => x.Number).Column("ZANR");
}
}
我尝试使用与How to join table in fluent nhibernate中相同的策略映射第一个连接,但这不起作用,因为我没有从table_a到table_b的直接引用,连接它们的唯一方法是常数602(参见上面的SQL查询)。
我找不到某种方式在映射中以某种方式指定该常量。
答案 0 :(得分:0)
您可以轻松地将名称映射为只读属性
public EntityAMap()
{
Table("PUB.table_a");
Id(x => x.Id).Column("ID");
// if ZANR always has to be 1
Where("ZANR = 1");
Map(x => x.Number).Column("ZANR");
Map(x => x.Name).Formula("(SELECT c.TDTEXT FROM PUB.table_b b JOIN PUB.table_c c ON (c.ID = b.ID AND b.TDKEY = 602 AND c.TDNR = ZANR))");
}
更新:我只能想象一个隐藏的引用和委托给那里的名称属性
public EntityAMap()
{
HasOne(Reveal.Member<EntityA>("hiddenEntityC"));
}
public class EntityB
{
public virtual int Id { get; set; }
public virtual EntityA EntityA { get; set; }
}
public EntityCMap()
{
Where("Id = (SELECT b.Id FROM PUB.table_b b WHERE b.TDKEY = 602)");
References(x => x.EntityA).PropertyRef(x => x.Number);
}