2009-06-15 6 views
0

Je suis en train de construire l'association suivante dans NHibernate (la classe de base de l'entité contient une propriété Id, et les attributs sont de S # arp architecture)cartographie des références complexes dans NHibernate

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

Lorsque les données sur la commande est stockée dans ORDERS et les données sur les terminaux sont stockées dans les tables TERMINALS. Le problème est qu'il n'y a pas de lien direct entre les deux tables. Si j'avais un identifiant pour ORDERS.ORDER_ID je chercherais la ligne TERMINALS correspondante avec le SQL suivant.

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 

Comment puis-je mapper ceci dans NHibernate? De préférence, comment puis-je mapper cela dans Fluent NHibernate mais je pense que je pourrais le comprendre à partir du XML. Aussi, étant donné que la base de données avec laquelle je travaille est pleine de chaînes comme celle-ci, y a-t-il des suggestions de bonnes pratiques?

+0

Quelles sont les classes de client et de commande? – Paco

+0

Je ne sais pas ce que tu veux dire. J'ai donné une description complète de la classe de commande et même si j'ai un cours Client, son existence est orthogonale au problème en question. –

+0

Je ne vois pas ce que vous voulez faire avec la jointure interne cust_prod cp sur (o.CUST_PROD_ID = cp.CUST_PROD_ID) et client_terminal ct sur (cp.CUSTOMER_TERMINAL_ID = ct.CUSTOMER_TERMINAL_ID) – Paco

Répondre

1

Je suis assez sûr que vos options seraient à:

1) Carte contre SQL brute (voir la définition de doc NHibernate pour sql-query: nh docs) .. La section sur les mises à jour cartographiques/inserts est à droite après.

2) Ou, introduisons au moins des entités au milieu pour gérer la tenue des relations dans cust_prod et customer_terminal. Si ces tables utilisent des clés composites pour les PK, vous voudrez regarder comment mapper l'ID-composite et la clé-plusieurs-à-un.

Dans la deuxième option, vous auriez alors mapper soit un one-to-one (plusieurs un ou bidirectionnel) sur la jointure des entités.

3) Je n'ai pas regardé les processus stockés depuis toujours, mais je crois que NH 2.0+ a amélioré le support des sproc. Cela pourrait être une troisième option viable.

Questions connexes