This stack overflow question and answers fixes the issue http://stackoverflow.com/questions/706673/forcing-nhibernate-to-cascade-delete-before-inserts
On Apr 2, 8:27 am, Darren <[email protected]> wrote: > Looking back at the example, it might be a bit misleading on what I'm > trying to achieve. In the example the solution would be just delete > the book thats not needed anymore and don't worry about the update. > > The specific problem I'm having is that I have an ordered list of > items that need to be processed (almost like a print queue). The items > that have yet to be processed can be modified or removed. When an item > is removed the reference number (consecutive from 1 to n, and has the > unique constraint) need to remain consecutive hence the delete then > update. > > On Mar 25, 8:43 am, Darren <[email protected]> wrote: > > > Here's a test case, that fails on unique key constraint ie its doing > > the update before the delete. > > > I must have something wrong somewhere, but not sure where? > > > Mapping.hbm.xml: > > <?xml version="1.0" encoding="utf-8" ?> > > > <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" > > assembly="NHibernate.Test" > > namespace="NHibernate.Test.NHSpecificTest.DarrenC"> > > > <class name="Shelf" table="Shelves"> > > <id name="Id" column="Id"> > > <generator class="hilo" /> > > </id> > > > <property name="Location" column="Location" /> > > > <bag name="Books" inverse="true" cascade="all-delete-orphan"> > > <key column="ShelfId" /> > > <one-to-many class="Book" /> > > </bag> > > </class> > > > <class name="Book" table="Books"> > > <id name="Id" column="Id"> > > <generator class="hilo" /> > > </id> > > > <property name="Title" column="Title" unique="true"/> > > > <many-to-one name="Shelf" column="ShelfId" class="Shelf" /> > > > </class> > > > </hibernate-mapping> > > > Fixture: > > public class Shelf > > { > > private IList<Book> _Books; > > > /// <summary> > > /// Initializes a new instance of the Shelf class. > > /// </summary> > > public Shelf() > > { > > _Books = new List<Book>(); > > } > > > public virtual int Id { get; set; } > > public virtual string Location { get; set; } > > > public virtual IList<Book> Books > > { > > get { return _Books; } > > set { _Books = value; } > > } > > } > > > public class Book > > { > > public virtual int Id { get; set; } > > public virtual string Title { get; set; } > > public virtual Shelf Shelf { get; set; } > > } > > > [TestFixture] > > public class Fixture : BugTestCase > > { > > protected override string MappingsAssembly > > { > > get { return "NHibernate.Test"; } > > } > > > protected override IList Mappings > > { > > get { return new string[] > > { "NHSpecificTest.DarrenC.Mappings.hbm.xml" }; } > > } > > > [Test] > > public void Test() > > { > > Shelf shelf = new Shelf { Location = "Middle" }; > > > shelf.Books.Add( new Book { Title = "NHibernate In > > Action", Shelf = shelf } ); > > shelf.Books.Add( new Book { Title = "NHibernate In Action > > v2", Shelf = shelf } ); > > > using ( ISession s = OpenSession() ) > > using ( ITransaction t = s.BeginTransaction() ) > > { > > s.SaveOrUpdate( shelf ); > > t.Commit(); > > s.Flush(); > > } > > > using ( ISession s = OpenSession() ) > > using ( ITransaction t = s.BeginTransaction() ) > > { > > Shelf loadedShelf = s.Get<Shelf>( shelf.Id ); > > Assert.AreEqual( 2, loadedShelf.Books.Count ); > > > loadedShelf.Books.RemoveAt( 0 ); > > > Assert.AreEqual( "NHibernate In Action v2", > > loadedShelf.Books[0].Title ); > > // rename existing book to be the same as the removed > > book > > loadedShelf.Books[0].Title = "NHibernate In Action"; > > s.Update( loadedShelf ); > > t.Commit(); > > > Assert.AreEqual( 1, loadedShelf.Books.Count ); > > > s.Refresh( loadedShelf ); > > > Assert.AreEqual( 1, loadedShelf.Books.Count ); > > } > > } > > > protected override void OnTearDown() > > { > > ISession s = OpenSession(); > > ITransaction t = s.BeginTransaction(); > > s.Delete( "from Book" ); > > s.Delete( "from Shelf" ); > > t.Commit(); > > s.Close(); > > base.OnTearDown(); > > } > > } > > > On Mar 18, 10:17 am, Darren <[email protected]> wrote: > > > > I'll attempt to put together a test case. > > > > On Mar 16, 3:46 pm, Darren <[email protected]> wrote: > > > > > The child entity that is removed is not re-parented. The remaining > > > > child entity stays with its parent in gets the key of item that was > > > > removed. > > > > > On Mar 13, 12:04 am, Fabio Maulo <[email protected]> wrote: > > > > > > Are you re-parenting the child ? > > > > > > 2009/3/11 Darren <[email protected]> > > > > > > > In NHibernate documentation (section 9.2 - > > > > > > >http://www.hibernate.org/hib_docs/nhibernate/1.2/reference/en/html_si... > > > > > > ) > > > > > > I'm led to believe that when modifying collection elements > > > > > > NHibernate > > > > > > will perform deletes, updates then inserts. > > > > > > > I have the following problem: > > > > > > > I have an entity with a collection of items (the collection has > > > > > > cascade=all-delete-orphan) and the items have a unique key. I'm > > > > > > trying > > > > > > to delete an element from the collection (by doing a remove from the > > > > > > list) and then changing the key of an existing element to the one > > > > > > that > > > > > > was removed from the list. The problem I'm experiencing is that the > > > > > > update is occurring before the delete when I commit the changes to > > > > > > the > > > > > > entity and consequently violating the unique key. > > > > > > > The code looks something like this: > > > > > > > item = entity.collection[0]; > > > > > > item2 = entity.collection[1]; > > > > > > entity.collection.Remove(item); > > > > > > item2.name = item.name; > > > > > > session.SaveOrUpdate(entity); > > > > > > session.Commit; > > > > > > > Do you think this is a bug or am I doing something wrong? > > > > > > > Darren > > > > > > -- > > > > > Fabio Maulo --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/nhusers?hl=en -~----------~----~----~----~------~----~------~--~---
