2010-06-09 3 views
0

Je me suis cogné la tête contre un mur de briques pendant presque deux jours pour que toute aide soit géniale.Nhibernate - Référencer des objets transitoires dans des sessions déconnectées

Le scénario que j'ai est fondamentalement ceci.

J'ai un objet appelé Campaign que je crée de toutes pièces dans un client Web. Le Campaign a une référence à un autre objet, Portal. Le Portal a été extrait de la base de données via NHibernate. Quand je viens d'appeler CreateCampaign(Campaign cmp) NH barfs dire que la référence à Portal est transitoire et doit être enregistré en premier. Si je crée tout à partir de zéro alors ça fonctionne bien.

Donc, en bref, j'ai une nouvelle instance Campaign qui fait référence à une instance détachée de Portal. Les cascades sont définies sur 'enregistrer-mettre à jour, fusionner'. Ai-je besoin de recharger toutes les instances détachées dans la session avant de pouvoir appeler session.Save ou est-ce quelque chose d'autre que je ne suis pas au courant.

Désolé si cela semble un peu vague et pour l'absence de code, .. NDAs m'empêchent de poster et de code.

Merci d'avance.

Répondre

1

Vous pouvez utiliser ISession.Lock pour attacher votre objet transitoire à la même session qui est utilisée pour persister campagne:

session.Lock(myPortal, LockMode.None); 
myCampaign.Portal = myPortal; 
session.Save(myCampaign); 
+0

n'a pas ce que cela signifie que je dois reconstruire la campagne si? J'ai beaucoup d'instances détachées plus bas dans le modèle, ce qui rendrait la plupart des opérations très impliquées. J'espérais que je pourrais juste passer la nouvelle campagne et laisser NH faire le reste, .. ou est-ce que je demande trop? – Stimul8d

+0

Cet échange m'amène à conclure que le comportement de Lock dépend de vos paramètres de cascade: https://forum.hibernate.org/viewtopic.php?f=25&t=961144&view=next. Je ne sais pas si l'appel de Lock sur un objet persistant (Campaign) se répercuterait sur les objets enfants ou si vous deviez le faire vous-même. –

+0

En fait, j'ai fini par changer les paramètres de cascade et en utilisant session.refresh et le session.merge. Vous êtes sur la bonne voie cependant, merci. – Stimul8d

Questions connexes