Pergunta

Estou ficando louco aqui tentando resolver um problema de atualização/exclusão em cascata :-)

Eu tenho uma entidade pai com uma coleção de entidades infantis. Se eu modificar a lista de entidades filhos em um objeto pai destacado, adicionando, excluindo etc. - não estou vendo as atualizações em cascata corretamente com a coleção Child.

Arquivos de mapeamento:

  <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>

Teste

    [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();
        }
    }

Suponho que o fato de o produto ter sido atualizado para não ter filhos em sua coleção - as crianças seriam excluídas na tabela parent_child. Os problemas parecem ter algo a ver com anexar o produto à nova sessão? Como a cascata é definida como Orfão-Orfão, presumo que as alterações na coleção seriam propagadas para as entidades/tabelas relevantes? Neste caso, exclui?

O que estou perdendo aqui?

C

Foi útil?

Solução

Eu tenho me esforçado com um problema semelhante. Não tenho certeza se minha solução se encaixará no seu problema, mas tente usar isession.merge em vez de isession.update.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top