2010-07-03 6 views
2

Je sais qu'il y a beaucoup de discussions à ce sujet, mais j'ai essayé tout ce que je pouvais voir depuis un moment maintenant mais toujours pas de chance.Supprimer de la collection ne fonctionne pas à Nhibernate

J'ai un objet Item, qui contient une collection de itemdocument. En utilisant nhibernate pour lier à la base de données, je peux facilement ajouter à ma collection de itemdocument, mettre à jour des éléments dedans, etc, mais quoi que je fasse, je ne peux pas supprimer.

Je charge l'élément de la même session que j'essaie de supprimer. J'ai même ajouté la session en tant que propriété de l'objet item, et j'utilise cette propriété pour l'enregistrer, juste au cas où. Si j'utilise un Session.Delete() sur un document item dans la collection, puis que je réenregistre l'objet item (sans retirer le document item de la collection), il crée en fait un nouvel objet, qui doit être attendu. Cela me dit que mes économies fonctionnent.

J'espère que tout cela est logique, je reçois un peu frustré et pourrait ne pas être aussi clair que je veux ...

Voir mes correspondances pour l'objet d'article:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="namespace.Business.BusinessEntity"> 

    <class name="Item, namespace" table="[dbo].[Item]"> 

    <id name="ItemId" column="ItemId" type="Int32" unsaved-value="0"> 
     <generator class="identity" /> 
    </id>  

    <property name="ItemCode" column="ItemCode" type="String" length="50" /> 
    <property name="InternalDescription" column="InternalDescription" type="String" length="254" /> 
    <property name="IsEnabled" column="IsEnabled" type="Boolean" /> 
    <property name="Size" column="Size" type="String" length="50" />  

    <set name="Pictures" cascade="all-delete-orphan" inverse="true" > 
     <key column="ItemId" not-null="true"/> 
     <one-to-many class="ItemDocument" /> 
    </set> 

    </class> 
</hibernate-mapping> 

Mapping pour l'objet Itemdocument:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="namespace.Business.BusinessEntity"> 

    <class name="ItemDocument, namespace" table="[dbo].[ItemDocument]"> 

    <id name="ItemDocumentId" column="ItemDocumentId" type="Int32"> 
     <generator class="identity" /> 
    </id>  

    <property name="Order" column="[Order]" type="Int32" /> 

    <many-to-one name="Item" class="Item" column="ItemId" not-null="true" /> 
    <many-to-one name="Document" class="Document" column="DocumentId" cascade="save-update" not-null="true"/> 

    </class> 
</hibernate-mapping> 

code pour la suppression:

//This does nothing 
item.Pictures.Remove(item.Pictures.ElementAt(0)); 
session.SaveOrUpdate(item); 

//This neither 
session.Delete(item.Pictures.ElementAt(0)); 
item.Pictures.Remove(item.Pictures.ElementAt(0)); 
session.SaveOrUpdate(item); 
+0

Est-ce enveloppé dans de toute sorte de transaction? – apollodude217

+0

Je ne sais pas si cela est important ici, mais la valeur non enregistrée de ItemDocumentId doit-elle être 0? – apollodude217

+0

ItemDocumentId n'est pas 0 car il existe. Voulez-vous dire que je devrais le faire 0 si je veux le supprimer? Pour la transaction, pas de différence si j'en utilise un ou pas. Faire une mise à jour à ItemDocument persiste dans la base de données, donc je suppose que les transactions ne sont pas mon problème ici. – David

Répondre

0

Avez-vous essayé de supprimer l'élément de collection, puis d'obtenir à nouveau l'élément? comme dans obtenir la référence de l'élément que vous souhaitez supprimer, supprimez-le, puis utilisez hql pour récupérer l'objet mis à jour?

+0

Je ne suis pas sûr de vous suivre, avez-vous un exemple? – David

3

Peut-être que c'est juste un code partiel, mais il n'y a pas d'appel à session.Flush(). Rien n'est conservé dans la base de données jusqu'à ce que Flush soit appelé (pour le FlushMode par défaut d'Auto). Essayez ceci:

item.Pictures.Remove(item.Pictures.ElementAt(0)); 
session.Flush(); 

Vous ne devez appeler SaveOrUpdate si l'article est un objet transitoire. En supposant que vous avez déjà récupéré l'élément en utilisant NHibernate, alors il est persistant. Chapter 9 dans la documentation a les détails.

Edit: Pictures est le côté inverse, de sorte que vous devez définir la référence à nulle sur le côté « plusieurs » de la collection:

var pictureToRemove = item.Pictures.ElementAt(0); 
pictureToRemove.Item = null; 
item.Pictures.Remove(pictureToRemove); 
session.Flush(); 
+0

Si je fais ceci: item.Pictures.ElementAt (0) .Order = 9; session.Flush(); Il exécute la mise à jour par rapport à la base de données (même chose si je fais SaveOrUpdate()). Si je fais la même chose que ci-dessus, rien ne se passe. C'est pareil pour toutes mes collections, il y a quelque chose que je ne reçois pas ici ... – David

+0

Toujours ne fait rien du côté de SQL Server. Si j'essaie de faire Session.Delete (pictureToRemove); IT déclenche une erreur indiquant qu'une propriété not-null a été définie sur null. – David

Questions connexes