Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Do Fluent conventions break lazy loading? (uNhAddIns)

I have a simple entity class in a WPF application that essentially looks like this:

public class Customer : MyBaseEntityClass
{
    private IList<Order> _Orders;
    public virtual IList<Order> Orders
    {
        get { return this._Orders; }
        set {this._Orders = new ObservableCollection<Order>(value);}
    }
}

I'm also using the Fluent automapper in an offline utility to create an NHibernate config file which is then loaded at runtime. This all works fine but there's an obvious performance hit due to the fact that I'm not passing the original collection back to NHibernate, so I'm trying to add a convention to get NHibernate to create the collection for me:

public class ObservableListConvention : ICollectionConvention
{
    public void Apply(ICollectionInstance instance)
    {
        Type collectionType =
            typeof(uNhAddIns.WPF.Collections.Types.ObservableListType<>)
            .MakeGenericType(instance.ChildType);
        instance.CollectionType(collectionType);
    }
}

As you can see I'm using one of the uNhAddIns collections which I understand is supposed to provide support for both the convention and INotification changes, but for some reason doing this seems to break lazy-loading. If I load a custom record like this...

var result = this.Session.Get<Customer>(id);

...then the Orders field does get assigned an instance of type PersistentObservableGenericList but its EntityId and EntityName fields are null, and attempting to expand the orders results in the dreaded "illegal access to loading collection" message.

Can anyone tell me what I'm doing wrong and/or what I need to do to get this to work? Am I correct is assuming that the original proxy object (which normally contains the Customer ID needed to lazy-load the Orders member) is being replaced by the uNhAddIns collection item which isn't tracking the correct object?

UPDATE: I have created a test project demonstrating this issue, it doesn't reference the uNhAddins project directly but the collection classes have been added manually. It should be pretty straightforward how it works but basically it creates a database from the domain, adds a record with a child list and then tries to load it back into another session using the collection class as the implementation for the child list. An assert is thrown due to lazy-loading failing.

like image 840
Mark Feldman Avatar asked Nov 25 '13 04:11

Mark Feldman


Video Answer


1 Answers

I FINALLY figured out the answer to this myself...the problem was due to my use of ObservableListType. In NHibernate semantics a list is an ordered collection of entities, if you want to use something for IList then you want an unordered collection i.e. a Bag.

The Eureka moment for me came after reading the answer to another StackOverflow question about this topic.

like image 177
Mark Feldman Avatar answered Sep 20 '22 23:09

Mark Feldman