Отношения NHibernate с общим составным ключом - PullRequest
3 голосов
/ 08 июня 2011

У меня есть две таблицы с составными ключами и таблица связи между ними, вот так:

  • A

    • aid (PK)
    • sharedkey (PK)
  • B

    • ставка (PK)
    • sharedkey (PK)
  • Связывание

    • помощь
    • ставка
    • sharedkey
    • sortorder

Таким образом, неудобно использовать общий ключ, который является частью обоих FK.Вот первое, что я попробовал (я использую Fluent, но у меня возникла бы такая же проблема с отображениями XML):

mapping.HasManyToMany(x => x.Bees)
    .Table("Linking")
    .ParentKeyColumns.Add("aid", "sharedkey")
    .ChildKeyColumns.Add("bid", "sharedkey")
    .OrderBy("sortorder");

, что дает исключение для сопоставления: «Повторяющийся столбец в сопоставлении для сбора»,потому что я вставил sharedkey дважды.Это имеет смысл, потому что я не говорил в NH, что я действительно хочу, чтобы sharedkey были одинаковыми в каждом направлении.

Java-версия Hibernate имеет formula функцию это решает это точно, но NH, AFAIK, нет.Так как я могу отобразить это?

Некоторые предостережения:

  1. Для этого не обязательно быть в беглости.С XML тоже все хорошо
  2. Это все только для чтения, поэтому, если решение ломает вставки каким-то забавным способом, это нормально
  3. Я вообще не могу изменить БД

1 Ответ

1 голос
/ 14 июня 2011

хакерское решение может быть

public AMap()
{
    CompositeId()
        .KeyProperty(x => x.Id, "aid")
        .KeyProperty(x => x.Name, "sharedkey");

    HasManyToMany(x => x.Bees)
        .Table("Linking")
        .ParentKeyColumns.Add("aid", "sharedkey")
        .ChildKeyColumn("bid").ChildPropertyRef("Id")
        .OrderBy("sortorder")
        ;
}

public BMap()
{
    CompositeId()
        .KeyProperty(x => x.Id, "bid")
        .KeyProperty(x => x.Name, "sharedkey");

    Map(x => x.Id, "bid")
        .Not.Insert();
}

, чтобы получить все B, это приведет к (псевдо sql):

SELECT l.bid FROM a LEFT JOIN linking l ON a.aid = l.aid AND a.sharedkey = l.sharedkey WHERE a.aid = ?

это получит все B с данной помощью и той же самой общей клавишей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...