流畅的nHibernate与BindingList <t> </t>

时间:2009-07-30 18:08:03

标签: nhibernate fluent-nhibernate

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>

3 个答案:

答案 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合作。