nHibernate提供错误:自定义类型未实现UserCollectionType:myApp.Domain.OrderLineCollection。
BindingList实现IList,为什么nHibernate试图使用UserCollectionType而不是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>
答案 0 :(得分:3)
NHibernate拥有自己的自定义类型列表,可以在下面实现IList 我担心如果不创建nHibernate UserType,你将无法使用你的。
但我可能错了,很高兴听到原因。 :)
答案 1 :(得分:0)
您可能想要检查由fluentNHibernate创建的XML - 它们很可能采用Line属性的类型并明确设置它。
如果您没有明确设置类型,这应该有效。我尝试实现了一个派生自IList的自定义集合 - 当我没有在映射中指定包/列表中的类型时它起作用。
好的,我做了一个快速测试 Arnis L。是对的 - 如果不实现UserCollectionType,它可能无法正常工作。根据我的经验,实施起来很痛苦。
(不知何故,我记得做过这样的事情,但我想我的想法在玩弄我的伎俩)
答案 2 :(得分:0)
我查看NHibernate源代码,至少对于PersistentBag和PersistentList,NHibernate会将ArrayList对象实例化为后端列表,而不是人们所能想到的OrderLineCollection。当你实现IUserColletionType时,有一个方法告诉NHibernate它应该创建什么样的集合,以及Hibernate应该使用什么样的持久集合来保存。看看this link可能会有很大帮助。但我仍然无法使用BindingList与Nhibernate合作。