2010-06-29 10 views
0

Probablement une question stupide, mais j'essaie toujours d'envelopper nHibernate. Pour autant que je sache à partir de l'utilisation du logiciel, nHibernate vous demande de faire un peu de manipulation supplémentaire pour enregistrer les modifications correctement. Imaginons que j'ai un objet X qui peut contenir beaucoup d'objet Y. Je vais créer un X qui a 2 Y, chacun ayant ses propres propriétés. Je décide alors que je veux mettre à jour X. Je vais ajouter un nouveau Y, et changer l'un des Y existants.Comment déterminer si l'objet nHibernate a changé

Donc je charge dans mon objet X en utilisant son identifiant. Je passe ensuite en revue les Y que j'ajoute, je les ajoute au X et je sauvegarde le lot en utilisant une instruction de mise à jour.

Si vous faites cela, vous trouverez les «anciens» Y devenus orphelins dans la base de données. Lequel, quand j'y pense, est exactement ce à quoi je m'attendrais - je ne me suis pas débarrassé de ces objets après tout, je viens d'en créer de nouveaux.

Il y a donc deux façons de voir cela. Soit je devrais supprimer toutes les données Y et ensuite les recréer, soit je devrais pouvoir signaler à nHibernate que ce que je fais est un changement et qu'il devrait être mis à jour des objets existants plutôt que d'en créer de nouveaux . Le problème est, je ne suis pas sûr de savoir quelle est la «bonne» approche ou la meilleure façon de le faire - le premier semble terriblement inefficace et le dernier signifie mettre beaucoup de drapeaux «changés» et de code très fiddly.

Donc je suis sûr qu'il doit y avoir une solution plus facile qui me manque dans ma stupidité. Quelqu'un peut-il me montrer à la meilleure approche et la meilleure façon de le gérer dans NHibernate ... qui est si la question n'a aucun sens du tout :)

Cheers, Matt

Répondre

1

Vous avez probablement une cartographie ou d'utilisation problème.

correctement configuré, votre utilisation doit être quelque chose comme ceci:

using (var session = sessionFactory.OpenSession()) 
using (var tx = session.BeginTransaction()) 
{ 
    var x = session.Get<X>(theId); 
    x.Ys[0].SomeProperty = theNewValue; 
    x.Ys.Add(theNewY); 
    tx.Commit(); 
} 

Vous devriez poster plus de détails sur les classes réelles, les correspondances et l'utilisation.

Aussi, je vous suggère de lire les documents en entier: http://nhibernate.info/doc/nh/en/index.html. Ce n'est que quelques heures, cela vous épargnera de nombreux jours de frustration.

Questions connexes