2012-10-04 66 views
5

Por alguna razón, NHibernate me dice que no puede convertir NHibernate.Collection.Generic.PersistentGenericSet[Ingredient] en System.Collection.Generic.IList[Ingredient], cuando intento obtener los datos del base de datos. Esta es una versión Simplfied de mi asignación de clase/aplicación:C# - NHibernate no puede emitir NHibernate.Collection.Generic.PersistentGenericSet a 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> 

que he visto varias preguntas relacionadas, pero todos me dicen utilizar IList, y eso es exactamente lo que yo 'Estoy haciendo.

+0

intente eliminar la creación de la nueva lista y la llamada ReadOnly. – Euphoric

+0

@ Euphoric, lo probé, realmente no hizo ninguna diferencia. – rmobis

+0

@Raphael_ podría publicar su código que finalmente funcionó. Y si es posible, podría publicar el código de 'Ingredient' (o explicar de qué se trata). Me encuentro con un problema y me pregunto si su solución lo solucionará. Gracias por adelantado. – REMESQ

Respuesta

7

La razón es que está utilizando un conjunto. Y PersistentGenericSet<T> simplemente no implementa la interfaz IList<T>.

Creo que debería simplemente hacer la propiedad del tipo IEnumerable<Ingredient>.
Esto resuelve dos problemas:

  1. a deshacerse del error que ha mencionado
  2. La API de la clase se comunica directamente a los consumidores de la clase no se les permite añadir ingredientes a través de esa propiedad.
+0

Lo he hecho funcionar con ICollection, ¿es IEnumerable algo mejor? – rmobis

+3

@Raphael_: Sí, 'ICollection ' aún parece que el usuario puede agregar elementos a través de esta propiedad. 'IEnumerable ', por el contrario, es una interfaz de solo lectura. Eso es lo que claramente quieres. –

+0

Me gustaría poder agregar/eliminar elementos a esta colección desde dentro de mi clase, a través de un método público. – rmobis

1

¿Quieres una lista, bolso o conjunto? Su modelo de dominio contiene un IList<T> pero lo ha mapeado como <set>.

Cambie su asignación a <bag> o <list> o cambie su modelo de dominio para usar ISet<T>.

+0

¿Podría revisar su respuesta? Creo que te perdiste algunas palabras. – rmobis

1

Cualquiera de los tipos de cambio de la propiedad a ISet de IList.

O cambie el mapeo de <set> a <list>.

Cuestiones relacionadas