2010-03-31 4 views
0

mon problème lokks semblable à celui-ci: (link)mapping NHibernate: supprimer la collection, insérer une nouvelle collection avec les anciens ID

mais j'ai un à plusieurs:

<set name="Fields" cascade="all-delete-orphan" lazy="false" inverse="true"> 
    <key column="[TEMPLATE_ID]"></key> 
    <one-to-many class="MyNamespace.Field, MyLibrary"/> 
</set> 

(i aussi essayé de utiliser) ce mappage est pour modèle objet. celui-ci et l'objet Champ ont leurs générateurs d'ID réglés sur identité. Quand j'appelle session.Update pour l'objet Template, ça fonctionne très bien, presque: si l'objet Field a un numéro d'identification, la requête UPDATE sql est appelée, si l'ID est 0, l'INSERT est exécuté. Mais si je supprime un objet Field de la collection, il n'a aucun effet sur la base de données. J'ai trouvé que si j'appelle aussi session.Delete pour cet objet Field, tout ira bien, mais en raison de l'architecture client-serveur je ne sais pas quoi effacer. J'ai donc décidé de supprimer tous les éléments de la collection et d'appeler session.Update avec une nouvelle collection. et j'ai un problème: nhibernate exécute l'opération UPDATE pour les objets Field qui ont un Id différent de zéro, mais ils sont supprimés de DB! Peut-être que je devrais utiliser un autre générateur Id ou smth .. Quelle est la meilleure façon de faire nhibernate effectuer "effacer tout"/"insert all" routine pour la collecte?

Répondre

2

L'entité que vous mettez à jour est-elle déjà associée à la session? (est-ce que vous chargez l'entité et modifiez cette instance chargée)?

On dirait que vous essayez de dire à nhibernate de mettre à jour une entité détachée, dans ce cas nhiberante ne peut pas savoir quelles entités ont été ajoutées/supprimées dans la collection. Dans ce cas, vous pouvez utiliser Merge:

var mergedEntity = session.Merge(entityPasedFromClient) 

L'opération de fusion va chercher la enity de la db comparer avec celui qui comme cela a été envoyé par le client et les fusionner, de cette façon l'entité qui nhiberante rapportez de la db (et est associé à la session) est modifié et récupéré plus tard, l'entité fusionnée est renvoyée (ce ne sera pas la même instance que l'entité à laquelle vous passez l'opération de fusion).

Je ne suis pas sûr de comprendre la dernière partie de votre question: "J'ai donc décidé de supprimer tous les éléments de la collection et d'appeler session.Update avec une nouvelle collection et j'ai un problème: nhibernate effectue l'opération UPDATE pour les objets Field dont l'ID est différent de zéro, mais ils sont supprimés de DB! "

Les éléments de champ sont-ils mis à jour puis supprimés?

+0

session.Merge est exactement ce que le médecin a dit! merci beaucoup! J'étais assez fou à cause de ça .. ouf .. – npeBeg