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

Reply via email to