web-dev-qa-db-fra.com

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

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é à l'aide de 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 à l'aide

session.Save(objReportRequest);

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

Je ne sais pas si j'ai correctement mappé la propriété EntityIds. Veuillez guider.

Je vous remercie!

82
iniki

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

Dans ce cas, utilisez IList<int> au lieu de List<int>

155
Mauricio Scheffer

J'ai trouvé qu'en utilisant ICollection<T> a travaillé où IList<T> non.

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

0
Alex Dresko