2009-06-12 9 views
8

Je développe un exemple d'application pour que je puisse apprendre les tenants et les aboutissants de NHibernate. Je suis aux prises avec un problème de suppression. Je souhaite être en mesure de supprimer un enregistrement enfant en le supprimant de la collection de son parent, puis en enregistrant le parent. J'ai mis en place une relation un-à-plusieurs bidirectionnelle et l'insertion/mise à jour fonctionne très bien.Supprimer un enregistrement enfant de la collection parent

Voici mes applications

Panier:

<bag name="Items" inverse="true" cascade="all"> <key column="BasketId" /> <one-to-many class="BasketItem" /> </bag>

BasketItem:

<many-to-one not-null="true" name="Basket" column="BasketId" />

Je voudrais appeler basket.RemoveBasketItem(BasketItem item) alors Session.SaveUpdate(basket) de telle sorte que l'élément du panier sera supprimé . Est-ce possible?

Répondre

16

changement cascade="all" dans cascade="all-delete-orphan".

cascade="all" ne supprimera vos enregistrements enfants si le parent est supprimé.

+0

Lorsque mon RemoveBasketItem ressemble à ceci: this.basketItems.Remove (itemToRemove); Je reçois cette erreur: Une collection avec cascade = "all-delete-orphelin" n'est plus référencée par l'instance d'entité propriétaire: Basket.Items –

+7

Vous semblez avoir écrasé la référence 'IList' qui contient les éléments de votre panier. Vous ne pouvez mettre votre propre implémentation de 'IList' que lorsque la référence de la liste est nulle - si vous chargez un panier depuis la BD, NH mettra son propre' PersistentBag' comme implémentation 'IList' - et vous devez laisser cette référence seul pour que la cascade fonctionne correctement. – mookid8000

+1

Je l'ai eu pour travailler! Merci pour votre aide :-) J'avais des problèmes parce que ma propriété panier.Items était en train de lire une liste en lecture seule. Maintenant, je retourne simplement l'instance privée de mes objets. –

2

J'ai même scénario et Ive utilisé cascade = « all-delete-orphan » dans bagList mais quand je supprimer un seul élément enfant dans une collection, il supprime l'objet parent aussi bien.

+1

Assurez-vous que votre objet enfant en cascade.. = "aucun" –

+0

Merci pour le commentaire .... c'est le chaînon manquant dans la plupart des entrées en ligne !!! – Jonathan

+0

+1 million, m'a aidé où la plupart des ressources en ligne ne mentionnent pas, comme l'a dit Jonathan. –

0

j'avais le même problème que initforthemoney en raison de retourner une nouvelle liste en lecture seule de mon getter de collection. J'ai trouvé que je pouvais continuer à utiliser la liste ReadOnly en changeant la stratégie d'accès à la propriété de la collection de nosetter à field.

0

J'avais un problème où les éléments mes enfants où retour d'un Ordonné dénombrable. J'ai déplacé la commande à mon mapping et ai retourné les enfants comme c'est le cas pour IEnumerable. Cela a fonctionné pour moi!

Questions connexes