2010-11-16 5 views
1

dans mon entité de commande je reçois une référence null sur orderItems. Cela se produit lors de la création d'une commande. Je voudrais pouvoir ajouter quelque chose commeinstanciation d'une collection nhibernate

order.OrderItems = new Iesi.Collections.Set<OrderItem>(); 

l'erreur est « Impossible d'accéder constructeur protégé « Set » ici

public class Order 
    { 
     public virtual int Id { get; set; } 
     public virtual ISet<OrderItem> OrderItems { get; set; } 

     public virtual void AddOrderItem(OrderItem item) 
     { 
      item.Order = this; 
      // OrderItems below is null 
      OrderItems.Add(item); 
     } 

    } 


<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="EStore.Domain" 
        namespace="EStore.Domain.Model"> 

    <class name="Order" table="Orders"> 
    <id name="Id" type="Int32" column="Id" unsaved-value="0"> 
     <generator class="identity"/> 
    </id> 

    <property name="UserName" column="UserName"/> 
    <set name="OrderItems" table="OrderItems" generic="true" cascade="all-delete-orphan" inverse="true" > 
     <key column="OrderId" not-null="true" /> 
     <one-to-many class="EStore.Domain.Model.OrderItem, EStore.Domain" /> 
    </set> 

    </class> 
</hibernate-mapping> 

Répondre

2

comme un paquet mentionné ci-dessus

"Puisque Iesi.Collections.Set est une classe abstra Vous devez utiliser l'une des implémentations telles que Iesi.Collections.HashedSet, Iesi.Collections.HybridSet, Iesi.Collections.ListSet ou Iesi.Collections.SortedSet "

J'ai mis à jour la méthode suivante. La partie clé est "new HashedSet();"

public virtual void AddOrderItem(OrderItem item) 
    { 
     item.Order = this; 
     if (item.Order.OrderItems == null) 
     { 
      item.Order.OrderItems = new HashedSet<OrderItem>(); 
     } 
     OrderItems.Add(item); 
    } 
5

Set OrderItems à une nouvelle liste dans le constructeur

public Order() { 
OrderItems = new List<OrderItem>(); 
} 
+0

@frosty: Cela n'a rien à voir avec nhibernate. Sans cette ligne, vous obtiendrez cette erreur si vous travaillez avec NH ou non. – UpTheCreek

+0

Désolé, je devrais avoir mentionné, que Set est de type Iesi.Collections.Set. Cependant, je ne peux pas faire ce qui suit order.OrderItems = new Iesi.Collections.Set (); l'erreur est "Impossible d'accéder au constructeur protégé" Définissez "ici – frosty

+3

Puisque Iesi.Collections.Set est une classe abstraite, vous devrez utiliser l'une des implémentations telles que Iesi.Collections.HashedSet, Iesi.Collections.HybridSet, Iesi.Collections. ListSet ou Iesi.Collections.SortedSet –