I get this error when trying to save an item with Merge. The item has a bag 
(Children) which I like to be bindable, hence transformed to an 
ObservableCollection with a custom accessor.

This is the mapping:
RootItemMap() {
            Id(x => x.Id); 
            Map(x => x.Description);
            HasMany<ChildItem>(x => 
x.Children).Access.Using<ObservableAccessor<ChildItem>>().KeyColumn("RootId").Cascade.All();
}

This works fine in on the client. I can add and remove items and the UI 
responds fine. But when I try to save the changes with session.Merge I get 
the above exception.

Any ideas? If I add a Try-Catch in the Set method this works just fine.

Here is a test class that illustrates the fault (ThenItCanBeSavedWithMerge 
causes the error):
namespace MergeProblem.Tests
{
    [TestFixture]
    public class WhenWorkingWithRootItemWithChildren
    {
        private int _id;
        private RootItem _root;

        [TestFixtureSetUp]
        public void AddRootWithChildrenToDatabase()
        {
            var root = new RootItem();
            root.Description = "My decription";
            IList<ChildItem> children = new 
ObservableCollection<ChildItem>() { new ChildItem() { Description = "First 
child" }, new ChildItem() { Description = "Second child"}};
            root.Children = children;

            using (var session = SessionManager.GetSession())
            {
                using (var tx = session.BeginTransaction())
                {
                    session.SaveOrUpdate(root);
                    tx.Commit();
                }

                _id = root.Id;
                _root = root;
            }
        }

        [Test]
        public void ThenItCanBeAccessed()
        {
            using (var session = SessionManager.GetSession())
            {
                var root = session.Get<RootItem>(_id);

                Assert.IsNotNull(root, "Root is null");
                Assert.AreEqual(_id, root.Id, "Id incorrect");
                Assert.IsNotNull(root.Children, "Children is null");
                Assert.AreEqual(2, root.Children.Count);
            }
        }

        [Test]
        public void ThenTheChildrenCollectionIsObservable()
        {          
            Assert.That(_root.Children, 
Is.InstanceOf(typeof(INotifyCollectionChanged)), "We want the collection to 
be observable");
        } 

        [Test]
        public void ThenItCanBeSavedWithMerge()
        {
            var newChild = new ChildItem() { Description = "New child" };
            _root.Children.Add(newChild);

            using (var session = SessionManager.GetSession())
            {
                using (var tx = session.BeginTransaction())
                {
                    _root = session.Merge(_root);
                    tx.Commit();
                }
            }

            Assert.AreEqual(3, _root.Children.Count);
        }
    }
}

 

-- 
You received this message because you are subscribed to the Google Groups 
"Fluent NHibernate" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/fluent-nhibernate/-/6tLFlNbG9CcJ.
To post to this group, send email to fluent-nhibernate@googlegroups.com.
To unsubscribe from this group, send email to 
fluent-nhibernate+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/fluent-nhibernate?hl=en.

Reply via email to