2012-10-04 6 views
5

Aus irgendeinem Grunde zu werfen, ist NHibernate mir zu sagen, es nicht NHibernate.Collection.Generic.PersistentGenericSet[Ingredient]-System.Collection.Generic.IList[Ingredient] umwandeln kann, wenn ich versuche, die Daten aus dem bekommen Datenbank. Dies ist eine simplfied Version meiner Klasse Kartierungs-/Umsetzung:C# - NHibernate nicht in der Lage NHibernate.Collection.Generic.PersistentGenericSet zu System.Collections.Generic.IList

public class Product { 
    protected Product() { }; 

    public virtual Name { get; set; } 
    public virtual IList<Ingredient> { 
     get { return new List<Ingredient>(ingredients).AsReadOnly(); } 
     protected set { ingredients = value; } 
    } 

    private IList<Ingredient> ingredients = new List<Ingredient>(); 
} 

-

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="LanchesAdmin.Core.Domain.Product, LanchesAdmin.Core" table="product" > 
     <id name="ID" generator="identity"> 
      <column name="id" not-null="true" /> 
     </id> 

     <property name="Name" column="name" length="64" not-null="true" /> 

     <set name="Ingredients" table="ingredient" fetch="join" lazy="true" inverse="true"> 
      <key column="product_id" /> 
      <one-to-many class="LanchesAdmin.Core.Domain.Ingredient, LanchesAdmin.Core" /> 
     </set> 
    </class> 
</hibernate-mapping> 

ich mehrere ähnliche Fragen gesehen habe, aber sie alle sagen mir, IList zu verwenden, und das ist genau das, was ich 'Ich tue.

+0

versuchen, die Erstellung der neuen Liste und den ReadOnly-Aufruf zu entfernen. – Euphoric

+0

@Euphoric, versuchte es, machte keinen Unterschied. – rmobis

+0

@Raphael_ könnten Sie Ihren Code posten, der schließlich funktioniert hat. Und wenn möglich, könnten Sie den Code für "Ingredient" (oder erklären, was es ist). Ich stoße auf ein Problem und frage mich, ob Ihre Lösung es beheben wird. Danke im Voraus. – REMESQ

Antwort

7

Der Grund ist, dass Sie ein Set verwenden. Und PersistentGenericSet<T> implementiert einfach nicht die IList<T> Schnittstelle.

Ich denke, Sie sollten einfach die Eigenschaft des Typs IEnumerable<Ingredient> machen.
Dies löst zwei Probleme:

  1. Sie von dem Sie
  2. Die API der Klasse erwähnt Fehler loszuwerden kommuniziert direkt, dass die Verbraucher von Ihrer Klasse sind Zutaten über diese Eigenschaft nicht erlaubt hinzuzufügen.
+0

Ich habe es mit ICollection funktioniert, ist IEnumerable besser? – rmobis

+3

@Raphael_: Ja, 'ICollection ' sieht immer noch so aus, als ob der Benutzer Elemente über diese Eigenschaft hinzufügen kann. 'IEnumerable ' im Gegenteil ist eine schreibgeschützte Schnittstelle. Das ist es, was du eindeutig willst. –

+0

Ich möchte in der Lage sein, Elemente in dieser Sammlung über eine öffentliche Methode aus meiner Klasse hinzuzufügen/zu entfernen. – rmobis

1

Wollen Sie eine Liste, Tasche oder Set? Ihr Domänenmodell enthält eine IList<T>, aber Sie haben es als <set> zugeordnet.

Ändern Sie entweder Ihr Mapping in eine <bag> oder <list> oder ändern Sie Ihr Domänenmodell, um eine ISet<T> zu verwenden.

+0

Können Sie Ihre Antwort überprüfen? Ich glaube, du hast ein paar Worte verpasst. – rmobis

1

Entweder den Typ der Eigenschaft zu ISet von IList ändern.

Oder ändern Sie die Zuordnung von <set> zu <list>.