2012-10-04 16 views
5

Per qualche motivo, NHibernate mi sta dicendo che non è possibile convertire NHibernate.Collection.Generic.PersistentGenericSet[Ingredient] in System.Collection.Generic.IList[Ingredient], quando provo ad ottenere i dati dal Banca dati. Questa è una versione semplificazioni rese del mio mappatura classe/implementazione:C# - NHibernate non è in grado di eseguire il cast di NHibernate.Collection.Generic.PersistentGenericSet su 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> 

Ho visto diverse questioni connesse, ma tutti mi dicono di utilizzare IList, e questo è esattamente quello che ho 'sto facendo.

+0

provare a rimuovere la creazione della nuova lista e la chiamata ReadOnly. – Euphoric

+0

@Euphoric, l'ho provato, non ha fatto alcuna differenza. – rmobis

+0

@Raphael_ potresti pubblicare il tuo codice che alla fine ha funzionato. E se possibile, potresti pubblicare il codice per 'Ingredient' (o spiegare di cosa si tratta). Mi sto imbattendo in un problema e mi sto chiedendo se la soluzione risolverà il problema. Grazie in anticipo. – REMESQ

risposta

7

Il motivo è che si sta utilizzando un set. E PersistentGenericSet<T> semplicemente non implementa l'interfaccia IList<T>.

Penso che si dovrebbe semplicemente rendere la proprietà di tipo IEnumerable<Ingredient>.
Questo risolve due problemi:

  1. a sbarazzarsi del l'errore che hai menzionato
  2. L'API della classe comunica direttamente che i consumatori della vostra classe non è permesso di aggiungere gli ingredienti con quella proprietà.
+0

L'ho fatto funzionare con ICollection, IEnumerable è migliore? – rmobis

+3

@Raphael_: Sì, 'ICollection ' sembra ancora che l'utente possa aggiungere elementi tramite questa proprietà. 'IEnumerable ' al contrario è un'interfaccia di sola lettura. Questo è quello che vuoi chiaramente. –

+0

Mi piacerebbe poter aggiungere/rimuovere elementi a questa raccolta dalla mia classe, attraverso un metodo pubblico. – rmobis

1

Vuoi una lista, una borsa o un set? Il tuo modello di dominio contiene IList<T> ma lo hai mappato come <set>.

Cambiare la mappatura su <bag> o <list> o modificare il modello di dominio per utilizzare uno ISet<T>.

+0

Puoi rivedere la tua risposta? Penso che tu abbia perso alcune parole. – rmobis

1

Modificare il tipo di proprietà su ISet da IList.

Oppure modificare la mappatura da <set> a <list>.

Problemi correlati