2016-05-16 16 views
0

vier Tabellen Stellen: A, B , C und D . Primärschlüssel von A Tabelle ist ID_A. Primärschlüssel von B Tabelle ist ID_B. C Tabelle hat einen zusammengesetzten Primärschlüssel (ID_A, ID_B). D Tabelle verweist alle drei anderen Tabellen und hat drei Fremdschlüssel auf zwei Spalten ID_A und ID_B. Referenzen von D Tabelle zu B und C Tabellen sind optional.fliessend NHibernate Bezug auf zusammengesetzten Schlüssel

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

erklärte ich Zuordnungen für D Tabelle als:

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"); 

Das Problem: Beim Versuch Zeilen auszuwählen aus D Tabelle Ich habe ORA-00918: Spalte zweideutig definiert weil Nhibernate erwähnt ID_A und ID_B Spalten zweimal in generierten SQ L Frage.

Frage: Wie soll ich Mappings für D Tabelle angeben?

Antwort

0

In einer solchen Situation I Karte C nur in D, A und B, die in C zugeordnet, so können Sie von D nach A oder B durch C. navigieren

Nach meiner Erfahrung versuchen, in eine solche abzukürzen Die Situation hatte keinen großen Nutzen und verursachte zu viele Probleme (die Mühe nicht wert). (Vielleicht habe ich noch nie eine tatsächlich funktionierende "Abkürzung" erreicht.)

+0

Frederic, guter Rat. Leider ist es in meiner Situation nicht geeignet, da ** D.ID_B ** nullfähig ist und Referenzen von ** D ** auf ** B ** und ** C ** optional sind. Ich habe eine Frage aktualisiert. – user2291296

+0

Nun, dann habe ich nur den klassischen Rat übrig: Vermeide den zusammengesetzten Schlüssel so gut wie möglich, benutze stattdessen den Ersatzschlüssel. Auf diese Weise haben Sie eine C-Fremdschlüsselspalte, die in D nullgültig sein kann, und einen Fremdschlüssel. B Fremdschlüssel sollte in D nicht mehr hilfreich sein. –