2010-01-22 1 views
0

у меня есть 2 субъектов, как это:Свободно-NHibernate: как карта один-ко-многим в 3 таблицы (многие-ко-многим, своего рода)

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 таблицы, как это:

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

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

  • таблица АВ с 2 колонки: AID и BID

+0

Зачем нужна таблица ref (AB), если вы хотите, чтобы один-ко-многим? –

+0

потому что большую часть времени, почти всегда, что столбец FK, созданный одним-ко-многим, будет равен нулю – Omu

+0

. Тогда почему таблица table не имеет следующий столбец 'AId REFERENCES A NULL'? –

ответ

2

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

  • таблица А с 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); 
    } 
} 

Update

Невозможно сопоставить это, как вы хотите, в nhibernate (и никакое другое orm, если на то пошло). Причина этого довольно проста: она нарушает множество правил, и никогда не бывает причин для этого. Правильный способ сделать это - иметь нулевую ссылку fk в таблице b. Вот как вы представляете ссылку в базе данных sql. Это просто плохой дизайн для использования многих-ко-многим, когда вы имеете в виду один-ко-многим, и это, безусловно, даст вам проблемы позже.

+0

это не потому, что оно равно NULL, потому что я не хочу, чтобы он присутствовал в этой таблице – Omu

+0

Я не вижу Зачем? Что бы это принесло вам? –

+0

Я не собираюсь иметь столбец FK в моей таблице, который почти всегда будет нулевым. – Omu

1

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

HasManyToMany<T>(); 

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

+0

Я знаю, что я могу сделать это как простое отношение ManyToMany, но это потребует от меня поставить список в моей сущности вместо простой ссылки – Omu

1

что вы хотите References (х => x.RefToA);

Нижеследующее из приведенного ниже документального подтверждения.

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

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

http://wiki.fluentnhibernate.org/Fluent_mapping

+0

да, но это создаст столбец идентификатора FK, и я не хочу этого, Вместо этого мне нужна 3-я таблица – Omu

+0

Тогда вы хотите HasOne (x => x.RefToA); любая причина, по которой вы не хотите PK для стола с трещинами? наследство? –

+0

Мне не нужен другой столбец FK в моей таблице, потому что большую часть времени этот столбец будет пустым, поэтому я хочу поместить его в третью таблицу, я мог бы сделать это с помощью HasManyToMany, но с таким подходом I мне пришлось бы писать MyCollectionProperty [0] все время (потому что оно может быть не более одного) – Omu

0

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

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.

Смежные вопросы