我正在努力将用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表并不是很重要,因为它只是获取“父”信息,我可以从我的应用程序中的其他部分访问该信息。
答案 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;