Impossible de convertir un objet de type NHibernate.Collection.Generic.PersistentGenericBag en liste

85

J'ai une classe appelée ReportRequest comme:

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

Il est mappé en utilisant Fluent Hibernate comme:

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

Maintenant, je crée un objet de cette classe comme

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

et essayez d'enregistrer l'objet dans la base de données en utilisant

session.Save(objReportRequest);

J'obtiens l'erreur suivante: "Impossible de lancer un objet de type 'NHibernate.Collection.Generic.PersistentGenericBag 1[System.Int32]' to type 'System.Collections.Generic.List1 [System.Int32]'. "

Je ne suis pas sûr d'avoir mappé correctement la propriété EntityIds. Veuillez guider.

Merci!

inutile
la source
êtes-vous sûr de vouloir une liste d'entités et non une liste d'entités associées?
Mauricio Scheffer

Réponses:

161

Utilisez des interfaces de collection au lieu de collections concrètes, afin que NHibernate puisse l'injecter avec sa propre implémentation de collection.

Dans ce cas, utilisez à la IList<int>place deList<int>

Mauricio Scheffer
la source
1
Merci! résolu le problème. Pouvez-vous s'il vous plaît élaborer un peu lorsque vous dites "NHibernate peut l'injecter avec sa propre implémentation de collection."
inutan
C'est expliqué ici: surcombe.com/nhibernate-1.2/api/html/…
Mauricio Scheffer
2
Ce lien n'existe plus. Une mise à jour ou un bref contenu serait très apprécié.
Noich le
2
Je suis confus par le nombre de personnes sur stackoverflow se plaignant de liens morts. Personne n'a entendu parler d'archive.org? web.archive.org/web/20091105034326/http
Mauricio Scheffer
0

J'ai trouvé que l'utilisation ICollection<T>fonctionnait là où cela IList<T>ne fonctionnait pas.

Je ne suis pas un sorcier NHibernate, mais je voulais jeter un os à quelqu'un d'autre qui pourrait atterrir sur ce problème.

Alex Dresko
la source
Cela dépend de la façon dont votre collection est mappée. Pour bagvous pouvez utiliser IList<T>et pour ensemble -ISet<T>
Roman Artiukhin