2009-09-09 8 views
2

Je vais les noix ici pour essayer de résoudre une mise à jour en cascade/supprimer problème :-)cascade NHibernate - problème avec des entités indépendantes

J'ai une entité mère avec une collection d'entités enfants. Si je modifie la liste des entités enfant dans un objet parent détaché, en ajoutant, supprimant etc - je ne vois pas les mises à jour en cascade correctement à la collection enfant.

fichiers de mappage:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Domain" 
        namespace="Domain"> 

    <class name="Parent" table="Parent" > 

    <id name="Id"> 
     <generator class="guid.comb" /> 
    </id> 

    <version name="LastModified" 
        unsaved-value="0" 
        column="LastModified" 
        /> 

    <property name="Name" type="String" length="250" /> 

    <bag name="ParentChildren" lazy="false" table="Parent_Children" cascade="all-delete-orphan" inverse="true"> 
     <key column="ParentId" on-delete="cascade" /> 
     <one-to-many class="ParentChildren" /> 
    </bag> 

    </class> 

    <class name="ParentChildren" table="Parent_Children"> 

    <id name="Id"> 
     <generator class="guid.comb" /> 
    </id> 

    <version name="LastModified" 
        unsaved-value="0" 
        column="LastModified" 
        /> 

    <many-to-one 
    name="Parent" 
    class="Parent" 
    column="ParentId" 
    lazy="false" 
    not-null="true" 
     /> 
    </class> 
</hibernate-mapping> 

test

[Test] 
    public void Test() 
    { 
     Guid id; 
     int lastModified; 
     // add a child into 1st session then detach 
     using(ISession session = Store.Local.Get<ISessionFactory>("SessionFactory").OpenSession()) 
     { 
      Console.Out.WriteLine("Selecting..."); 
      Parent parent = (Parent) session.Get(typeof (Parent), new Guid("4bef7acb-bdae-4dd0-ba1e-9c7500f29d47")); 

      id = parent.Id; 
      lastModified = parent.LastModified + 1; // ensure the detached version used later is equal to the persisted version 

      Console.Out.WriteLine("Adding Child..."); 
      Child child = (from c in session.Linq<Child>() select c).First(); 
      parent.AddChild(child, 0m); 

      session.Flush(); 
      session.Dispose(); // not needed i know 
     } 

     // attach a parent, then save with no Children 
     using (ISession session = Store.Local.Get<ISessionFactory>("SessionFactory").OpenSession()) 
     { 
      Parent parent = new Parent("Test");    

      parent.Id = id; 
      parent.LastModified = lastModified; 

      session.Update(parent); 
      session.Flush(); 
     } 
    } 

Je suppose que le fait que le produit a été mis à jour sans enfants dans sa collection - les enfants seraient supprimés dans la table Parent_Child. Les problèmes semblent être liés à l'attachement du produit à la nouvelle session? Comme la cascade est définie sur all-delete-orphelin, je suppose que les modifications apportées à la collection seront propagées aux entités/tables pertinentes. Dans ce cas supprime?

Qu'est-ce qui me manque ici?

C

+0

Quel est le type de liste d'enfants dans votre classe parente? – Beatles1692

+1

Pouvez-vous poster la solution à votre problème? Dire simplement que vous l'avez réglé n'est pas utile. –

+0

Je suis confronté à un problème similaire et je n'ai pas réussi à le résoudre. Pouvez-vous fournir les détails de la façon dont vous avez résolu ce problème? S'il vous plaît! – skrishna

Répondre

2

J'ai strugling avec problème similaire. Je ne sais pas si ma solution correspondra à votre problème, mais essayez d'utiliser ISession.Merge au lieu de ISession.Update.

+0

Merci pour la réponse! La fusion de session semble fonctionner pour faire mes suppressions. Mais ne fonctionne pas si nécessaire dans la situation suivante lorsque les collections enfants doivent être effacées en premier: Parent.Children.Clear() 'puis insère Parent.AddChild (enfant1); parent.AddChild (enfant2); session.Merge (parent); Tout ce que je reçois sont les insertions et non la suppression initiale nécessaire pour effacer la collection ... Me conduire les noix comme cela doit être une exigence commune! –

+0

Étrange ... ça a marché dans mon cas. – maciejkow

+0

Trié - Merci un million! –

Questions connexes