2009-11-19 7 views
2

EntitésNHibernate mise à jour de référence

Nous avons une entité appelée produit qui est chargé en utilisant NHibernate.

Le produit a une catégorie que NHibernate remplit avec bonheur pour moi.

Database

Dans la base de données, le produit a une clé étrangère pour la catégorie.

Scénario

utilisateur édite ce produit (via une interface web) et choisit une autre catégorie (par exemple au lieu de "poisson" nous choisissons "Veg").

Ceci est probablement une liste déroulante, avec chaque catégorie affichée. Quand ils choisissent une catégorie différente, nous obtenons une clé int.

Problème

Il est évident que nous voulons maintenant enregistrer les modifications au produit mais en effet le seul changement est d'enregistrer un nouveau int (par exemple 2, au lieu de 1).

Donc, nous récupérons le produit existant, et maintenant vient le problème.

Nous n'avons pas de champ "CategoryID" sur Product, nous n'avons qu'une propriété Category.

Mais nous ne voulons pas vraiment récupérer la catégorie (par ID) juste pour l'assigner au produit.

donc je suppose que ce que je veux savoir si nous ...

a) Ajouter une propriété CategoryID au produit

b) créer une nouvelle catégorie, attribuez-lui l'id pertinent et que joindre à produit (mais sûrement qui provoqueront des erreurs, ou remplacer la catégorie existante)

c) Récupérer (recherche) la catégorie du système (par id) et fixez que le produit

d) Est-ce autre chose !

Répondre

2

Mise à jour: Session.load est le correct answer

product.Category = session.Load<Category>(2); 

session.Save(product); 
+0

Oui, cela semble fonctionner. La seule petite complication que j'ai eue était que pour un champ datetime nullable je devais m'assurer que mes mappings et model reflétaient le fait qu'il était nullable (sinon NHibernate a jeté une erreur au sujet des valeurs datetime invalides) –

+0

mais cette date nullable était sur le produit (pas la catégorie) droit? – dotjoe

+0

+1 Je suis revenu à nouveau. :) – Dusty

0

Utilisez NH EnumStringType<T> pour mapper votre catégorie en tant qu'ensemble à la valeur de base de données respective (qui peut être une chaîne ou un nombre). Vous trouverez quelques exemples d'utilisation, si vous google pour cela.

HTH!

4

Il semble que vous puissiez utiliser la fonctionnalité Session.Load (id).

Session.Load est une méthode spéciale qui renvoie un proxy avec l'ID jusqu'à ce que vous demandiez une autre propriété à quel point il charge. Il génère une erreur si aucun élément ne correspond à l'ID. Essayez quelque chose comme:

product.Category = Session.Load<Category>(2); //2 being the new category ID 

Session.SaveOrUpdate(product); 

Je viens de faire un petit test et il ne semble pas retirer l'ensemble de la catégorie.

+0

maintenant je ne suis pas sûr de façon de le faire ... Je l'utilise quand je charge la mise à jour d'une entité existante, mais êtes-vous aussi censé utiliser Load pour chaque référence? hmmm – dotjoe

+1

Une bonne règle dans NHibernate est de rendre le setter de la colonne Identity privé ou protégé. Cela ne vous permettrait pas d'attribuer l'identifiant comme vous l'avez fait dans votre réponse. Découvrez SharpArchitecture pour une bonne mise en œuvre ainsi que la façon de bricoler avec Id dans les tests. Comme indiqué Session.Load ne fait rien avec la base de données sauf si une propriété est demandée, donc nous faisons essentiellement la même chose que votre réponse juste avec un objet plus intelligent qui peut se résoudre si nécessaire. –

+0

excellent point – dotjoe

Questions connexes