Fluent-NHibernate: как отобразить отношения один-ко-многим в 3 таблицы (типа «многие ко многим») - PullRequest
0 голосов
/ 22 января 2010

Мне нужно 2 объекта, как это:

class A
{
   int id { get; set; }
   string Name { get; set; }
}

class B
{
   int id { get; set; }
   A RefToA { get; set; }
   string Name { get; set; }
}

Как я могу отобразить эти 2 класса, чтобы у меня было 3 таблицы как это:

  • таблица A с 2 столбцами: идентификатор и имя

  • таблица B с 2 столбцами: идентификатор и имя

  • таблица AB с 2 столбцами: AId и BId

Ответы [ 4 ]

2 голосов
/ 01 февраля 2010

Если я правильно понимаю, вы создаете таблицу ссылок, потому что хотите, чтобы ссылка была обнуляемой. Если это так, вам не нужна справочная таблица. Просто установите FK в таблице b как обнуляемые. Тогда вы можете отобразить это простой справочник. Тогда у вас будут такие таблицы:

  • таблица A с 2 столбцами: идентификатор и имя
  • таблица B с 2 столбцами: идентификатор, имя и Помощь (nullable)

И вы можете отобразить это так:

public class AMap : ClassMap<A>
{
  public AMap()
  {
      Id(x => x.Id); 
      Map(x => x.Name);
  }
}

public class BMap : ClassMap<B>
{
  public BMap()
  {
     Id(x => x.Id); 
     Map(x => x.Name);
     References(x => x.RefToA);
  }
}

Обновление

Нет способа отобразить это так, как вы хотите в nhibernate (и никакой другой формы в этом отношении). Причина этого довольно проста: он нарушает довольно много правил, и нет никаких причин делать это таким образом. Правильный способ сделать это состоит в том, чтобы иметь пустую ссылку fk в таблице b. Вот как вы представляете ссылку в базе данных SQL. Использовать «многие ко многим», когда вы имеете в виду «один ко многим», просто нехорошо, и в дальнейшем это наверняка доставит вам проблемы.

1 голос
/ 01 февраля 2010

то, что вы хотите, это ссылки (x => x.RefToA);

Следующее ниже взято из беглой документации nhibernate.

Ссылки / многие-к-одному

Ссылки для создания отношений «многие к одному» между двумя объектами; вы ссылаетесь на другую сущность, поэтому вы используете метод References. Ссылка на один экземпляр объекта

http://wiki.fluentnhibernate.org/Fluent_mapping

1 голос
/ 25 января 2010

Это типичные отношения ManyToMany. В FluentNHibernate вы бы использовали

HasManyToMany<T>();

http://wiki.fluentnhibernate.org/Fluent_mapping#HasManyToMany_.2F_many-to-many

0 голосов
/ 01 февраля 2010

Вы не должны отображать отношение «один ко многим» как отношение «многие ко многим», а затем заставлять его «один ко многим». Его плохой дизайн и не способствует целостности данных. На вашем месте я бы создал ваши таблицы следующим образом

CREATE TABLE A(
    Id INT PRIMARY KEY IDENTITY(1,1),
    --Your other columns
)

CREATE TABLE B(
    Id INT PRIMARY KEY IDENTITY(1,1),
    AId INT REFERENCES A NULL,
    --Your other columns
)

Таким образом, вы можете отобразить их так, как вы хотите, в Fluent NHibernate или любом другом ORM.

...