map triple将sql连接到nhibernate。 (奇怪设计的旧数据库)

时间:2011-07-27 07:17:09

标签: c# sql fluent-nhibernate

我正在努力将用powerbuilder编写的旧应用程序转换为.NET应用程序。在这个过程中,我们使用旧的数据库,并且powerbuilder应用程序中使用的一些查询很难转换为nhibernate流畅的映射(至少对我来说)。

我有以下sql来获取位列表:

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) 

我应该如何将其映射为nhibernate?我应该使用条件和连接,还是仅仅使用对其他表的引用进行映射?另一个挑战是数据库中的关键约束非常少,例如BIT和OF,或CMS和OF之间没有关键约束。

任何人都知道如何解决这一挑战?我还必须能够更新CMS.WHOLE_S。

第一次加入BS表并不是很重要,因为它只是获取“父”信息,我可以从我的应用程序中的其他部分访问该信息。

1 个答案:

答案 0 :(得分: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;