0

私は現在、(Fluent)NHibernateを取得してオブジェクトをレガシーデータベーススキーマにマップしようとしています。関連する3つのテーブルがあります。

  • 表aには、取得する必要のある実際のオブジェクトのほとんどの情報が含まれています
  • 表bは、表aと表cを接続する表です。
  • 表cには、オブジェクトに必要な追加のフィールドが1つあります。

情報を取得するための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;

主な問題は、マッピングでこれら2つの結合条件をどのように指定するかです。

テーブル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");
    }
}

流暢なnhibernateでテーブルを結合する方法と同じ戦略で最初の結合をマップしようとしましたが、table_aからtable_bへの直接参照がないため、これは機能しません。それらを接続するのは定数602だけです。 (上記のSQLクエリを参照してください)。

どういうわけか、マッピングでその定数を指定する方法が見つかりませんでした。

4

1 に答える 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);
}
于 2012-07-23T08:37:08.910 に答える