首页 文章

(流畅)NHibernate:将字段从单独的表映射到对象

提问于
浏览
0

我目前正试图让(流畅的)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查询) ) .

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

1 回答

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

相关问题