Impossibile eseguire il cast di oggetti di tipo NHibernate.Collection.Generic.PersistentGenericBag in elenco


85

Ho una classe chiamata ReportRequest come:

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;
    }
}

Viene mappato utilizzando Fluent Hibernate come:

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();
    }
}

Ora creo un oggetto di questa classe come

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

e prova a salvare l'oggetto nel database usando

session.Save(objReportRequest);

Ottengo il seguente errore: "Impossibile eseguire il cast di un oggetto di tipo" NHibernate.Collection.Generic.PersistentGenericBag 1[System.Int32]' to type 'System.Collections.Generic.List1 [System.Int32] ". "

Non sono sicuro di aver mappato correttamente la proprietà EntityIds. Per favore guida.

Grazie!


sei sicuro di volere un elenco di int e non un elenco di entità correlate?
Mauricio Scheffer

Risposte:


161

Usa interfacce di raccolta invece di raccolte concrete, in modo che NHibernate possa iniettarlo con la propria implementazione della raccolta.

In questo caso, usa IList<int>invece diList<int>


1
Grazie! risolto il problema. Puoi per favore elaborare un po 'quando dici "NHibernate può iniettarlo con la propria implementazione della raccolta".
inutan


2
Questo collegamento non esiste più. Uno aggiornato o il breve contenuto sarebbe molto apprezzato.
Noich


2
Sono confuso dal numero di persone su StackOverflow che si lamentano dei collegamenti morti. Nessuno ha mai sentito parlare di archive.org? web.archive.org/web/20091105034326/http://elliottjorgensen.com/…
Mauricio Scheffer

0

Ho scoperto che l'uso ha ICollection<T>funzionato dove IList<T>no.

Non sono un mago di NHibernate, ma volevo gettare un osso a qualcun altro che potrebbe atterrare su questo problema.


Dipende da come è mappata la tua collezione. Per bagte puoi usare IList<T>e per set -ISet<T>
Roman Artiukhin
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.