2009-06-15 1 views
0

Ich versuche, die folgende Assoziation in NHibernate (die Basis Entity-Klasse enthält eine Id-Eigenschaft, sie und die Attribute von S # arp-Architektur) zu bauenMapping kompliziert Referenzen in NHibernate

public class Terminal : Entity { 
    public virtual string Name { get; set; } 
} 
public class Order : Entity { 
    [NotNull] 
    public virtual Terminal Terminal { get; set; } 
} 

Wo die Daten auf Reihenfolge wird in ORDERS und Daten auf Terminals gespeichert in den TERMINALS-Tabellen gespeichert. Das Problem ist, dass es keine direkte Verbindung zwischen den beiden Tabellen gibt. Wenn ich eine ID für ORDERS.ORDER_ID hätte, würde ich die entsprechende TERMINALS-Zeile mit dem folgenden SQL holen.

select t.* 
from ORDERS o 
    inner join cust_prod cp on (o.CUST_PROD_ID = cp.CUST_PROD_ID) 
    inner join customer_terminal ct on (cp.CUSTOMER_TERMINAL_ID = ct.CUSTOMER_TERMINAL_ID) 
    inner join terminal t on (ct.TERMINAL_ID = t.TERMINAL_ID) 
where o.ORDER_ID = :p_order_id 

Wie kann ich dies in NHibernate abbilden? Am besten wie kann ich dies in Fluent NHibernate abbilden, aber ich denke, ich könnte es aus dem XML herausfinden. Angesichts der Tatsache, dass die alte Datenbank, mit der ich arbeite, voller solcher Ketten ist, gibt es irgendwelche Best-Practice-Vorschläge?

+0

Was sind die Kunden- und Auftragsklassen? – Paco

+0

Ich weiß nicht, was du meinst. Ich gab eine vollständige Beschreibung der Auftragsklasse und während ich eine Kundenklasse habe, ist ihre Existenz orthogonal zu dem vorliegenden Problem. –

+0

Ich sehe nicht, was Sie mit innerem Join tun cust_prod cp on (o.CUST_PROD_ID = cp.CUST_PROD_ID) und customer_terminal ct on (cp.CUSTOMER_TERMINAL_ID = ct.CUSTOMER_TERMINAL_ID) – Paco

Antwort

1

Ich bin mir ziemlich sicher, dass Ihre Möglichkeiten wären:

am NHibernate doc Definition für SQL-Abfrage

1) Karte gegen rohe SQL (aussehen: nh docs) .. Der Abschnitt über die Mapping-Updates/Inserts ist richtig nach.

2) Oder führen Sie mindestens Entitäten in der Mitte ein, um die Beziehungen in cust_prod und customer_terminal zu übernehmen. Wenn diese Tabellen zusammengesetzte Schlüssel für die PKs verwenden, sollten Sie sich die Zuordnung von Composite-ID und Schlüssel-Viele-zu-Eins ansehen.

In der zweiten Option würden Sie dann entweder eine eins-zu-eins (oder bidirektionale viel-eins) auf den Join-Entitäten zuordnen.

3) Ich habe die gespeicherten Procs nicht für immer angesehen, aber ich glaube, dass NH 2.0+ eine bessere Unterstützung von SPROC eingeführt hat. Das könnte eine brauchbare dritte Option sein.