2012-07-23 51 views
0

我目前正試圖獲得(流利)NHibernate映射對象到我們的遺留數據庫模式。有三個表涉及。(流利)NHibernate的:從單獨的表到對象的地圖字段

  • 表一個包含實際對象我需要檢索
  • 表B的大多數信息是與表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; 

的主要問題是如何在映射中指定這兩個連接條件。

實體表看起來是這樣的:

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

,請問您對實體是什麼樣子?你到目前爲止試過了什麼樣的映射? – 2012-07-23 07:23:58

回答

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

更新:我只能想象一個隱藏的參考,並且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); 
} 
+0

問題是底層數據庫引擎不支持SELECT語句中的子查詢,只能在WHERE語句中使用。 此外,我們需要能夠修改此值。 – cguedel 2012-07-23 08:50:45

+0

謝謝,這似乎工作。然而,這不是很實際,因爲我們需要各種實體來引用具有不同TDKEY的實體C.也許我只是映射實體B/C而沒有引用它們並使用膠水類。 接受您的答案,因爲它解決了問題。 – cguedel 2012-07-23 20:00:23

+0

你可以通過不同的where子句按照你想要的頻率來引用EntityC。您需要爲每個實體名定義不同的實體名,並在實體名中指定它。 – Firo 2012-07-24 05:56:25

相關問題