Question

nHibernate is giving the error : Custom type does not implement UserCollectionType: myApp.Domain.OrderLineCollection.

BindingList implements IList, so why is nHibernate trying to use UserCollectionType instead of IList?

public class OrderHeader
{
    public virtual int OrderHeaderId { get; set; }
    public virtual string OrderNumber { get; set; }
    public virtual OrderLineCollection Line { get; set; }
}

public class OrderLineCollection : BindingList<OrderHeader> { }

public class OrderHeaderMap : ClassMap<OrderHeader>
{
    public OrderHeaderMap()
    {
        WithTable("Orders");
        Id(x => x.OrderHeaderId, "OrderId").GeneratedBy.Identity();
        Map(x => x.OrderNumber);
        HasMany(x => x.Line).WithKeyColumn("OrderHeaderId").AsList();
    }
}

<list name="Line">
  <key column="OrderHeaderId" /> 
  <index /> 
  <one-to-many class="myApp.Domain.OrderLine, myApp.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
</list>
Was it helpful?

Solution

NHibernate has it's own custom typed list which implements IList underneath.
I'm afraid you won't be able to use yours without creating nHibernate UserType.

But i might be wrong and would be glad to hear why. :)

OTHER TIPS

You might want to check the XML that's created by fluentNHibernate - it's quite possible they take the type of the Line property and set it explicitly.

This should work if you don't set the type explicitly. I tried implementing a custom collection deriving from IList - and it worked when I didn't specify the type on the bag/list whatever in the mapping.

Ok, I did a quick test Arnis L. is right - it probably won't work without implementing UserCollectionType. In my experience, it's a pain to implement .

(somehow I remembered doing something like this but I guess my mind's playing tricks on me)

I look at the NHibernate source code and at least for PersistentBag and PersistentList NHibernate will instanciate a ArrayList object as the back end list, not a OrderLineCollection as one could thought. When you implement IUserColletionType there is a method who tells NHibernate what collection it should create, and also what Persistent collection Hibernate should use to sav. Take a look at this link might help a lot. But I still cant do Nhibernate work with BindingList.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top