NHibernate多对多域对象属性

时间:2009-10-15 11:29:51

标签: .net nhibernate

我刚刚开始使用NHibernate。我使用产品和供应商设置了一个简单的多对多场景,如下所示:

<class name="Product" table="Products">
    <id name="Id">
      <generator class="guid" />
    </id>
    <property name="Name" />

    <bag name="SuppliedBy" table="ProductSuppliers" lazy="true">
      <key column="ProductId" foreign-key="FK_ProductSuppliers_ProductId" />
      <many-to-many column="SupplierId" class="Supplier" />
    </bag>
</class>

<class name="Supplier" table="Suppliers">
    <id name="Id">
      <generator class="guid" />
    </id>
    <property name="Name" />

    <bag name="Products" table="ProductSuppliers" lazy="true" inverse="true">
      <key column="SupplierId"  foreign-key="FK_ProductSuppliers_SupplierId" />
      <many-to-many column="ProductId" class="Product" />
    </bag>
</class>

我现在正试图将行李连接到我的域对象。从阅读我提出的文档(使用Iesi.Collections lib):

'In Product
Private _Suppliers As ISet = New HashedSet()
Public Overridable Property SuppliedBy() As HashedSet
    Get
        Return _Suppliers
    End Get
    Set(ByVal value As HashedSet)
        _Suppliers = value
    End Set
End Property

'In Supplier
Private _Products As ISet = New HashedSet()
Public Overridable Property Products() As HashedSet
    Get
        Return _Products
    End Get
    Set(ByVal value As HashedSet)
        _Products = value
    End Set
End Property

但是,当我尝试将供应商添加到产品并调用save时,我收到以下错误

无法将'NHibernate.Collection.PersistentBag'类型的对象强制转换为'Iesi.Collections.HashedSet

我尝试过使用各种类型的内容,例如ICollection和List(Of T),但我一直都会遇到相同的错误。

无法转换类型为'NHibernate.Collection.Generic.PersistentGenericBag 1[Domain.Supplier]' to type 'System.Collections.Generic.List的对象1 [Domain.Supplier]

我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

该文档讨论了如何使用IList或IList(实体)创建一个包,并使用List或List(实体)构建它。 (NHibernate 1.2参考文献的第6.2节)。

行李的语义与集合的语义不匹配,即集合只能有唯一的实例,行李可以有重复的实例。作为一个公平的评论,List也不完全匹配一个包的语义(一个包没有索引),但它足够接近NHibernate。

您的收藏图应该是(使用泛型 - 取出(供应商)删除泛型:

'In Product
Private _Suppliers As IList(of Supplier) = New List(of Supplier)
Public Overridable Property SuppliedBy() As IList(of Supplier)
    Get
        Return _Suppliers
    End Get
    Set(ByVal value As IList(of Supplier))
        _Suppliers = value
    End Set
End Property

答案 1 :(得分:0)

公共财产Supplier.Products必须是ISetISet(Of Product)类型。