Nie można rzutować obiektu typu NHibernate.Collection.Generic.PersistentGenericBag na listę

85

Mam klasę o nazwie ReportRequest jako:

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

Jest mapowany przy użyciu Fluent Hibernate jako:

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

Teraz tworzę obiekt tej klasy jako

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

i spróbuj zapisać obiekt w bazie danych za pomocą

session.Save(objReportRequest);

Pojawia się następujący błąd: „Nie można szarego obiektu typu«NHibernate.Collection.Generic.PersistentGenericBag 1[System.Int32]' to type 'System.Collections.Generic.List. 1 [System.Int32]»

Nie jestem pewien, czy poprawnie zamapowałem EntityIds właściwości. Proszę o przewodnik.

Dziękuję Ci!

inutan
źródło
czy na pewno chcesz listę int, a nie listę powiązanych podmiotów?
Mauricio Scheffer

Odpowiedzi:

161

Używaj interfejsów kolekcji zamiast konkretnych kolekcji, aby NHibernate mógł wprowadzić własną implementację kolekcji.

W takim przypadku użyj IList<int>zamiastList<int>

Mauricio Scheffer
źródło
1
Dziękuję Ci! rozwiązał problem. Czy mógłbyś trochę rozwinąć, mówiąc: „NHibernate może wstrzyknąć mu własną implementację kolekcji”.
inutan
Wyjaśniono to tutaj: surcombe.com/nhibernate-1.2/api/html/…
Mauricio Scheffer
2
Ten link już nie istnieje. Bardzo mile widziana byłaby aktualizacja lub krótka treść.
Noich
2
Jestem zdezorientowany liczbą ludzi na stackoverflow narzekających na martwe linki. Czy nikt nie słyszał o archive.org? web.archive.org/web/20091105034326/http://elliottjorgensen.com/…
Mauricio Scheffer
0

Odkryłem, że używanie ICollection<T>działało tam, gdzie IList<T>nie.

Nie jestem czarodziejem NHibernate, ale chciałem rzucić kość komuś, kto mógłby wylądować w tej sprawie.

Alex Dresko
źródło
To zależy od tego, jak mapowana jest Twoja kolekcja. Bo bagmożesz użyć IList<T>i ustawić -ISet<T>
Roman Artiukhin