【问题标题】:(Fluent) NHibernate: Map field from separate table into object(流利)NHibernate:将字段从单独的表映射到对象
【发布时间】:2012-07-23 07:19:34
【问题描述】:

我目前正在尝试让 (Fluent)NHibernate 将对象映射到我们的旧数据库模式。涉及三个表。

  • 表 a 包含我需要检索的实际对象的大部分信息
  • 表b是连接表a和表c的表
  • 表 c 有一个我需要的对象的附加字段

检索信息的 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 查询)。

我没有找到以某种方式在映射中指定该常量的方法。

【问题讨论】:

  • 您的实体是什么样的?到目前为止,您尝试过哪些映射?

标签: nhibernate fluent-nhibernate


【解决方案1】:

您可以轻松地将名称映射为只读属性

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))");
}

更新:我只能想象一个隐藏的引用和委托给那里的 name 属性

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);
}

【讨论】:

  • 问题是底层数据库引擎不支持SELECT语句中的子查询,只支持WHERE语句。此外,我们需要能够修改此值。
  • 谢谢,这似乎有效。然而这不是很实用,因为我们需要各种实体来引用具有不同 TDKEY 的实体 C。也许我只是映射实体 B / C 而没有 A 引用它们并使用胶水类。接受您的回答,因为它解决了问题。
  • 您可以使用不同的 where 子句随意引用 EntityC。您需要为它们中的每一个定义一个不同的实体名称,并在其中指定它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2012-12-09
  • 2011-06-18
相关资源
最近更新 更多