Não é possível lançar o objeto do tipo NHibernate.Collection.Generic.PersistentGenericBag para a lista

85

Eu tenho uma classe chamada 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;
    }
}

Ele é mapeado usando o 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();
    }
}

Agora, eu crio um objeto desta classe como

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

e tente salvar o objeto no banco de dados usando

session.Save(objReportRequest);

Recebo o seguinte erro: "Não é possível lançar o objeto do tipo 'NHibernate.Collection.Generic.PersistentGenericBag 1[System.Int32]' to type 'System.Collections.Generic.List1 [System.Int32]'. "

Não tenho certeza se mapeei a propriedade EntityIds corretamente. Por favor, guie.

Obrigado!

Inutan
fonte
tem certeza de que deseja uma lista de ints e não uma lista de entidades relacionadas?
Mauricio Scheffer

Respostas:

161

Use interfaces de coleção em vez de coleções concretas, para que o NHibernate possa injetá-lo com sua própria implementação de coleção.

Neste caso, use em IList<int>vez deList<int>

Mauricio Scheffer
fonte
1
Obrigado! resolveu o problema. Você poderia elaborar um pouco quando disser 'NHibernate pode injetá-lo com sua própria implementação de coleção.'
inutan
É explicado aqui: surcombe.com/nhibernate-1.2/api/html/…
Mauricio Scheffer
2
Este link não existe mais. Um atualizado ou o conteúdo breve seria muito apreciado.
Noich
2
Estou confuso com o número de pessoas no stackoverflow reclamando de links inativos. Ninguém ouviu falar de archive.org? web.archive.org/web/20091105034326/http://elliottjorgensen.com/…
Mauricio Scheffer
0

Descobri que usar ICollection<T>funcionou onde IList<T>não funcionou .

Eu não sou nenhum mago do NHibernate, mas eu queria jogar um osso para outra pessoa que pudesse pousar neste problema.

Alex Dresko
fonte
Depende de como sua coleção é mapeada. Para bagvocê pode usar IList<T>e para definir -ISet<T>
Roman Artiukhin