2009-10-15 6 views
1

Je commence juste à travailler avec NHibernate. J'ai installé d'un simple nombre à plusieurs scénarios en utilisant les produits et fournisseurs comme suit:NHibernate Propriétés d'objet de domaine many-to-many

<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> 

Je suis maintenant essayer de câbler les sacs à mes objets de domaine. La lecture de la documentation que je suis venu avec (à l'aide 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 

Cependant, quand je tente d'ajouter un fournisseur à un produit et STOCKER je reçois l'erreur suivante

Impossible de jeter objet de type 'NHibernate.Collection.PersistentBag' de type 'Iesi.Collections.HashedSet

J'ai essayé d'utiliser toutes sortes de types, par exemple, ICollection et List (Of T) mais je continue d'obtenir l'erreur équivalente.

Impossible de jeter l'objet de type « NHibernate.Collection.Generic.PersistentGenericBag 1[Domain.Supplier]' to type 'System.Collections.Generic.List 1 [Domain.Supplier]

Qu'est-ce que je manque ici?

Répondre

2

La documentation parle de créer un sac en utilisant un IList, ou IList (de l'entité) et de le construire avec la liste, ou la liste (de l'entité). (Section 6.2 de la référence de NHibernate 1.2). La sémantique d'un sac ne correspond pas à celle d'un ensemble, c'est-à-dire qu'un ensemble ne peut avoir que des instances uniques et qu'un sac peut avoir des instances en double. Comme un commentaire juste, une liste ne correspond pas exactement à la sémantique d'un sac (un sac n'a pas d'index) mais il est assez proche pour NHibernate.

Votre mapping de la collection devrait alors être (en utilisant des génériques - prendre (du fournisseur) pour éliminer les médicaments génériques:

'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 
+0

Merci beaucoup fonctionne parfaitement! –

0

La propriété publique Supplier.Products doit être de type ISet ou ISet(Of Product).

Questions connexes