Используйте Fluent nHibernate для объединения двух таблиц с разными именами столбцов.

Я использую свободный nhibernate 3.1 для сопоставления с устаревшей базой данных. У меня есть два класса, и я хотел бы соединить B с A. Структура базы данных не имеет внешних ключей.

AModel.OccurrenceNumber и BModel.OccurrenceNumber имеют одинаковые данные (т.е. заявка № 1234 в одном и другом), просто разные имена столбцов. Можно ли присоединиться на этапе маппинга? Если нужно, я могу написать оператор linq, чтобы присоединиться к ним, но хотел бы знать, можно ли это сделать здесь. Заранее спасибо.

public class AMap : ClassMap<AModel>
{
    public AMap()
    {
        Table("ATable");

        Id(x => x.Id).GeneratedBy.Increment();
        Map(x => x.OccurrenceNumber).Column("OCCUR"); //Same Data
    }
}

public class BMap : ClassMap<BModel>
{
    public BMap()
    {
        Table("BTable");

        Id(x => x.Id).GeneratedBy.Increment();
        Map(x => x.OccurrenceNumber).Column("B69_CLAIM_OCCUR"); // Same Data
    }
}

person MetRay    schedule 01.08.2012    source источник
comment
этот столбец уникален в любой из таблиц, и вы хотите использовать его в качестве внешнего ключа?   -  person mykola    schedule 01.08.2012
comment
Да, данные, хранящиеся в этих столбцах, уникальны. Я попытался настроить внешний ключ, но безуспешно (скорее всего, ошибка ID10T).   -  person MetRay    schedule 02.08.2012
comment
так вам нужны отношения один-к-одному или один-ко-многим?   -  person mykola    schedule 02.08.2012
comment
На данный момент я вижу потребность только в один-на-один. В прошлом я устанавливал отношения внешнего ключа, однако у них было общее имя столбца, и, возможно, я переосмыслил это (мне нетрудно это сделать).   -  person MetRay    schedule 02.08.2012
comment
вы должны быть готовы использовать сопоставление ссылок или HasOne и указать имя столбца в другом классе. Ваши классы A и B должны иметь свойства-члены, ссылающиеся друг на друга. Тогда вы сможете делать в классе A что-то вроде References(x=›x.B).Class(typeof(B)).Fetch.Join().Column(B69_CLAIM_OCCUR); или HasOne(x=›x.B).Constrained().ForeignKey(B69_CLAIM_OCCUR);   -  person mykola    schedule 02.08.2012
comment
@mykola, спасибо за помощь! Я пробую несколько тестов, чтобы увидеть, работает ли это.   -  person MetRay    schedule 02.08.2012


Ответы (1)


Вы можете объявить следующую ссылку в своем классе AMap или BMap

References<AModel>(x => x.AModels).Column("B69_CLAIM_OCCUR").PropertyRef("OccurrenceNumber").ReadOnly();

Где данные AModeldata были определены в вашем классе BModel как

public virtual IList<AModel> AModels{ get; set; }

Таким образом, когда вы пишете запросы, соединяющие эти две таблицы, они будут автоматически объединены в B69_CLAIM_OCCUR и OCCUR.

Я предположил, что у вас есть отношение «один ко многим» между объектами A и B.

person user2026504    schedule 29.08.2013