Карта тройного присоединения SQL к Nhibernate.(старая база данных со странным дизайном) - PullRequest
0 голосов
/ 27 июля 2011

Я работаю над преобразованием старого приложения, написанного в 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 Ответ

1 голос
/ 27 июля 2011
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...