views:

704

answers:

3

I am going nuts here trying to resolve a cascading update/delete issue :-)

I have a Parent Entity with a collection Child Entities. If I modify the list of Child entities in a detached Parent object, adding, deleting etc - I am not seeing the updates cascaded correctly to the Child collection.

Mapping Files:

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

I assume that the fact that the product has been updated to have no children in its collection - the children would be deleted in the Parent_Child table. The problems seems to be something to do with attaching the Product to the new session? As the cascade is set to all-delete-orphan I assume that changes to the collection would be propagated to the relevant entities/tables? In this case deletes?

What am I missing here?

C

A: 

I've been strugling with similar issue. Not sure whether my solution will fit your problem, but try using ISession.Merge instead of ISession.Update.

maciejkow
Thanks for the reply! Session merge seems to work getting my deletes done. But doesn't work as needed in the following situation when the Child collections needs to be cleared first:Parent.Children.Clear()'then inserts Parent.AddChild(child1);parent.AddChild(child2);session.Merge(parent);All I get are the inserts and not the initial delete needed to clear the collection...Driving me nuts as this must be a common requirement!
Strange... it worked in my case.
maciejkow
Sorted - Thanks a million!
A: 

I am getting a strange error while using session.Merge My situation is different since I set some values in the OnSave event, which I now do in the OnMerge event. But here is the exception I get:

NHibernate.LazyInitializationException: illegal access to loading collection

Any help is appreciated.

skrishna
A: 

I am facing a similar issue and have not been able to resolve it. Can you provide the details of how you resolved this issue? Please!

skrishna