No se puede convertir el objeto de tipo NHibernate.Collection.Generic.PersistentGenericBag a la lista

85

Tengo una clase llamada ReportRequest como:

public class ReportRequest
{
    Int32 templateId;
    List<Int32> entityIds;

    public virtual Int32? Id
    {
        get;
        set;
    }

    public virtual Int32 TemplateId
    {
        get { return templateId; }
        set { templateId = value; }
    }

    public virtual List<Int32> EntityIds
    {
        get { return entityIds; }
        set { entityIds = value; }
    }

    public ReportRequest(int templateId, List<Int32> entityIds)
    {
        this.TemplateId = templateId;
        this.EntityIds = entityIds;
    }
}

Se asigna usando Fluent Hibernate como:

public class ReportRequestMap : ClassMap<ReportRequest>
{
    public ReportRequestMap()
    {
        Id(x => x.Id).UnsavedValue(null).GeneratedBy.Native();
        Map(x => x.TemplateId).Not.Nullable();            
        HasMany(x => x.EntityIds).Table("ReportEntities").KeyColumn("ReportRequestId").Element("EntityId").AsBag().Cascade.AllDeleteOrphan();
    }
}

Ahora, creo un objeto de esta clase como

ReportRequest objReportRequest = new ReportRequest(2, new List<int>() { 11, 12, 15 });

e intente guardar el objeto en la base de datos usando

session.Save(objReportRequest);

Aparece el siguiente error: "No se puede convertir el objeto de tipo 'NHibernate.Collection.Generic.PersistentGenericBag 1[System.Int32]' to type 'System.Collections.Generic.List1 [System.Int32]' " .

No estoy seguro de haber mapeado correctamente la propiedad EntityIds. Por favor guíe.

¡Gracias!

inutan
fuente
¿Está seguro de que desea una lista de entradas y no una lista de entidades relacionadas?
Mauricio Scheffer

Respuestas:

161

Utilice interfaces de colección en lugar de colecciones concretas, por lo que NHibernate puede inyectarlo con su propia implementación de colección.

En este caso, utilice en IList<int>lugar deList<int>

Mauricio Scheffer
fuente
1
¡Gracias! resuelto el problema. ¿Podrías desarrollar un poco cuando dices 'NHibernate puede inyectarlo con su propia implementación de colección'?
inutan
Se explica aquí: surcombe.com/nhibernate-1.2/api/html/…
Mauricio Scheffer
2
Este enlace ya no existe. Se agradecería mucho una actualización o el breve contenido.
Noich
2
Estoy confundido por la cantidad de personas en stackoverflow que se quejan de enlaces muertos. ¿Nadie ha oído hablar de archive.org? web.archive.org/web/20091105034326/http://elliottjorgensen.com/…
Mauricio Scheffer
0

Descubrí que el uso ICollection<T>funcionaba donde IList<T>no.

No soy un mago de NHibernate, pero quería tirar un hueso a otra persona que podría aterrizar en este tema.

Alex Dresko
fuente
Depende de cómo esté mapeada su colección. Para bagque pueda usar IList<T>y para configurar -ISet<T>
Roman Artiukhin