2011-07-27 7 views
0

私はpowerbuilderで書かれた古いアプリを.NETアプリに変換しようとしています。このプロセスでは、古いデータベースを使って作業していますが、powerbuilderアプリケーションで使用されているクエリの中には、(少なくとも私にとって)nhibernateの流暢なマッピングに変換するのは非常に難しいものです。map tripleはSQLをnhibernateに結合します。 (奇妙なデザインの古いデータベース)

私はビットのリストを取得するには、以下のSQLを持っている:私はNHibernateのにこれをマップする必要がありますどのように

SELECT MYSCHEME.BIT.BIT_S, 
     MYSCHEME.BIT.BIT_NAME, 
     MYSCHEME.BIT.BIT_TYPE, 
     MYSCHEME.BIT.BIT_SIZE,      
     MYSCHEME.BS.BS_NAME,  
     MYSCHEME.CMS.WHOLE_S 

FROM MYSCHEME.BIT join MYSCHEME.BS on (MYSCHEME.BIT.BS_S = MYSCHEME.BS.BS_S) 
left outer join MYSCHEME.OF on MYSCHEME.BIT.BIT_TYPE_S = MYSCHEME.OF.F_S 
left outer join MYSCHEME.CMS on MYSCHEME.OF.OF_S = MYSCHEME.CMS.PART_S 
WHERE (MYSCHEME.BS.BS_S = 25) 

を?条件と結合を使用するか、他のテーブルへの参照でマップするだけですか?もう1つの課題は、BITとOF、またはCMSとOFの間にキー制約がないなど、データベースに重要な制約がほとんどないことです。

誰もがこの課題を解決する方法を知っていますか? CMS.WHOLE_Sも更新できる必要があります。

BSテーブルへの最初の結合はそれほど重要ではありません。なぜなら、親情報を取得するだけなので、アプリケーションの他の部分からその情報にアクセスできます。

答えて

1
class Bit 
{ 
    public virtual BS Bs { get; set; } 
    public virtual int WholeS 
    { 
     get { return Bs.Of.CMS.WholeS; } 
     set { Bs.Of.CMS.WholeS = value; } 
    } 
} 

class BS 
{ 
    public virtual Of Of { get; set; } 
} 

class Of 
{ 
    public virtual CMS CMS { get; set; } 
} 

class CMS 
{ 
    public virtual int WholeS { get; set; } 
} 

class BitMap : ClassMap<Bit> 
{ 
    public BitMap() 
    { 
     References(bit => bit.Bs, "BS_S") 
      .Not.LazyLoad(); // should take care, that all is join-loaded 
    } 
} 
... 

Bit bit = session.Get<Bit>(25); 
int wholeS = bit.Bs.Of.CMS.WholeS; 

Bit bit = session.Get<Bit>(25); 
int wholeS = bit.WholeS; 
オーデル
関連する問題