Objekt vom Typ NHibernate.Collection.Generic.PersistentGenericBag kann nicht in List umgewandelt werden

85

Ich habe eine Klasse namens ReportRequest als:

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

Es wird mit Fluent Hibernate wie folgt zugeordnet:

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

Jetzt erstelle ich ein Objekt dieser Klasse als

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

und versuchen Sie, das Objekt in der Datenbank mit zu speichern

session.Save(objReportRequest);

Ich erhalte die folgende Fehlermeldung: "Objekt vom Typ 'NHibernate.Collection.Generic.PersistentGenericBag 1[System.Int32]' to type 'System.Collections.Generic.List1 [System.Int32]' kann nicht umgewandelt werden. "

Ich bin nicht sicher, ob ich die Eigenschaft EntityIds richtig zugeordnet habe. Bitte führen.

Danke dir!

Inutan
quelle
Sind Sie sicher, dass Sie eine Liste von Ints und keine Liste verwandter Entitäten möchten?
Mauricio Scheffer

Antworten:

161

Verwenden Sie Sammlungsschnittstellen anstelle konkreter Sammlungen, damit NHibernate eine eigene Sammlungsimplementierung hinzufügen kann.

In diesem Fall verwenden Sie IList<int>anstelle vonList<int>

Mauricio Scheffer
quelle
1
Danke dir! löste das Problem. Können Sie bitte etwas näher darauf eingehen, wenn Sie sagen: "NHibernate kann ihm eine eigene Sammlungsimplementierung hinzufügen."
Inutan
Es wird hier erklärt: surcombe.com/nhibernate-1.2/api/html/…
Mauricio Scheffer
2
Dieser Link existiert nicht mehr. Ein aktualisierter oder der kurze Inhalt wäre sehr dankbar.
Noich
2
Ich bin verwirrt über die Anzahl der Personen im Stackoverflow, die sich über tote Links beschweren. Hat niemand von archive.org gehört? web.archive.org/web/20091105034326/http://elliottjorgensen.com/…
Mauricio Scheffer
0

Ich fand, dass die Verwendung dort ICollection<T>funktionierte, wo IList<T>es nicht funktionierte.

Ich bin kein NHibernate-Assistent, aber ich wollte jemand anderem einen Knochen zuwerfen, der in dieser Angelegenheit landen könnte.

Alex Dresko
quelle
Dies hängt davon ab, wie Ihre Sammlung zugeordnet ist. Für bagSie können IList<T>und für Set -ISet<T>
Roman Artiukhin