2010-09-30 17 views
0

Je rencontre des problèmes avec une relation plusieurs-à-plusieurs que j'essaie de créer. L'objectif est de sauver un client et les produits qu'il est autorisé à acheter. Les produits ne sont pas uniques à un client et existeront TOUJOURS dans la base de données avant d'essayer d'y associer un client.NHibernate mappage plusieurs-à-plusieurs à des objets existants

Ma cartographie de l'association ressemble actuellement ...

<set name="AllowedProducts" table="Customer_AllowedProducts"> 
     <key column="CustomerId"></key> 
     <many-to-many class="Product" column="ProductId"/> 
</set> 

Si je tente de sauver un client je reçois un NHibernate.TransientObjectException référencement du produit. Je comprends que je pourrais ajouter une cascade à l'ensemble, mais je ne veux JAMAIS mettre à jour ou enregistrer un produit lors de l'enregistrement d'un client, nous voulons seulement mapper un client à des produits existants.

Je dois noter que le client que j'essaie d'enregistrer arrive d'un appel de service Web et ne fait donc pas référence aux produits qui ont été précédemment chargés dans la session. Je voudrais éviter d'avoir à charger chaque produit qui sera mappé dans la session.

Merci

Répondre

1

Votre code devrait ressembler à ceci:

customer.AllowedProducts.Add(session.Load<Product>(productIdFromTheRequest)); 

Au lieu de ce que vous faites probablement:

customer.AllowedProducts.Add(new Product {Id = productIdFromTheRequest}); 

Il convient de noter que Loadne va à la DB; il retourne juste un proxy (ou une instance récupérée, si une est présente dans la session en cours)

+0

Alors que je trouve que Load va à la DB (peut-être quelque chose d'autre que j'ai besoin d'adresser, paresseux fait = vrai le produit cartographie). Cela résout totalement le problème principal. Merci –

+0

Lazy devrait presque jamais être faux; si c'est le cas, il y a votre problème. –

+0

right - Je dis que c'est à la valeur par défaut (true) –

0

Vous devrez joindre le produit à hiberner session afin qu'ils deviennent entité gérée. Pour autant que je sache, il n'y a pas d'autre issue.