2016-05-16 3 views
0

Представьте четыре таблицы: , B, C и D. Основной ключ A стол ID_A. Основной ключ B стол ID_B. C таблица имеет составной первичный ключ (ID_A, ID_B). D таблица ссылается на все три другие таблицы и имеет три внешних ключа на двух ID_A и ID_B столбцы. Ссылки от D таблица B и до C таблицы являются необязательными.Свободно NHibernate ссылка на композитный ключ

A    B    C    D 
-------  -------  -------  ------- 
ID_A   ID_B   (ID_A,ID_B) 
    <--------------------- ID_A 
        <-------- ID_B   
    <----------------------------------- ID_A 
        < - - - - - - - - - - - ID_B 
           < - - - -(ID_A,ID_B) 

Я объявил отображения для D таблицы как:

mapping.References(e => e.A).Column("ID_A"); 
mapping.References(e => e.B).Column("ID_B"); 
mapping.References(e => e.C).Columns("ID_A", "ID_B"); 

Проблема: при попытке выбрать строки из D таблицы я получил ORA-00918: колонка двусмысленно определяется потому что Nhibernate упомянул ID_A и ID_B столбцы два раза в сгенерированном SQ L запрос.

Вопрос: Как указать сопоставления для D таблица?

ответ

0

В такой ситуации, я просто карта C в D, A и B привязываются в C, таким образом, вы можете переходить от D к A или B через C.

По моему опыту, пытаясь комбинациями в таком ситуация не имела никакой сильной выгоды и вызывала слишком много проблем (не стоит проблем). (Возможно, я даже не добился фактически функционального «ярлыка».)

+0

Фредерик, хороший совет. К сожалению, это не подходит в моей ситуации, так как ** D.ID_B ** является нулевым, а ссылки с ** D ** на ** B ** и ** C ** являются необязательными. Я обновил вопрос. – user2291296

+0

Ну, тогда у меня остается только классический совет: избегайте сложного ключа как можно больше, вместо этого используйте суррогатный ключ. Таким образом, у вас будет столбец C внешнего ключа с нулевым значением в D и его внешний ключ. B внешний ключ больше не должен быть полезным в D. –

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

  • Нет связанных вопросов^_^