Как использовать Fluent NHibernate для настройки следующих объединений? - PullRequest
0 голосов
/ 14 апреля 2011

Это основано на устаревшей системе.

У меня есть следующие таблицы:

CREATE TABLE a
  id int

CREATE TABLE b
  a_id int,
  c_id int
  relationshipid int -- must be IN (1, 2, 3)

CREATE TABLE c
  id int

Я хочу следующие доменные модели

public class A
{
  public int Id { get; set; }

  public C entityc { get ; set; }
}

public class C
{
  public int Id { get; set; }
}

Таблица b настроена таким образом, чтобы для определенного определенного относительного идентификатора была (ну, должна быть только одна) одна пара идентификаторов. Для других отношений это однозначное сопоставление через B не выполняется. Relationshipid может принимать одно из небольших значений.

Как мне перевести сущность C в класс A из отношения, в котором значение отношения 1 равно беглому NHIbernate?

В качестве дополнительного вопроса, есть ли название для того, что я пытаюсь сделать здесь? Первоначальный подход состоял в том, чтобы использовать HasOne с таблицей соединений и фильтровать результаты, но очевидно, что это с треском провалилось.

РЕДАКТИРОВАТЬ: Уточненный Идентификатор Отношения и цель.

1 Ответ

0 голосов
/ 15 апреля 2011

Я думаю, что самый простой способ отобразить это - сделать вашу таблицу b сущностью и иметь ссылки на A и C внутри этой сущности и RelationshipId в качестве идентификатора. Таким образом, ваши отображения будут выглядеть примерно так:

public class A
{
    public int Id { get; set; }

    public IList<B> bEntities { get; set; }
}

public class ClassAMap : ClassMap<A>
{
    public AMap()
    {
        Table("A");
        Id(x => x.Id);

        HasMany(x => x.bEntities)
            .KeyColumns.Add("a_id");
    }
}

public class B
{
    public virtual int RelationshipId { get; set; }
    public virtual A InstanceA { get; set; }
    public virtual C InstanceC { get; set; }
}

public class ClassBMap : ClassMap<B>
{
    public BMap()
    {
        Table("B");
        Id(x => x.RelationshipId , "relationshipid");

        References(x => x.InstanceA);
        References(x => x.InstanceC);
    }
}  

Редактировать:

Если вы хотите отфильтровать эти результаты для сбора сущностей B в вашей сущности A только с теми, которые соответствуют RelationshipId = 1, то вам следует взглянуть на этот пост:

Свободно говорит NHibernate и фильтрует отношения один-ко-многим в запросе, требующем нескольких объединений?

Вы также можете сделать что-то подобное в своем классе A:

public class A
{
    public int Id { get; set; }

    public IList<B> bEntities { get; set; }

    public C InstanceC
    {
       get { return bEntities.First<B>(x => x.RelationshipId == 1).InstanceC; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...