Неможливо привести об’єкт типу NHibernate.Collection.Generic.PersistentGenericBag до списку


85

У мене є клас, який називається ReportRequest як:

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

Він відображається за допомогою Fluent Hibernate як:

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

Тепер я створюю об'єкт цього класу як

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

і спробуйте зберегти об'єкт у базі даних за допомогою

session.Save(objReportRequest);

Я отримую таку помилку: "Не вдається1[System.Int32]' to type 'System.Collections.Generic.List привести об'єкт типу 'NHibernate.Collection.Generic.PersistentGenericBag 1 [System.Int32]'. "

Я не впевнений, що правильно відобразив властивість EntityIds. Будь ласка, керівництво.

Дякую!


Ви впевнені, що хочете список ints, а не список пов'язаних сутностей?
Маурісіо Шеффер

Відповіді:


161

Використовуйте інтерфейси колекцій замість конкретних колекцій, тому NHibernate може вводити його за допомогою власної реалізації колекції.

У цьому випадку використовуйте IList<int>замістьList<int>


1
Дякую! вирішив питання. Чи можете ви, будь ласка, трохи детальніше сказати, коли ви кажете: "NHibernate може ввести йому власну реалізацію колекції".
інутан


2
Це посилання більше не існує. Будемо вдячні за оновлений або короткий зміст.
Noich


2
Мене бентежить кількість людей на stackoverflow, які скаржаться на мертві посилання. Ніхто не чув про archive.org? web.archive.org/web/20091105034326/http://elliottjorgensen.com/…
Маурісіо Шеффер

0

Я виявив, що використання ICollection<T>працювало там, де IList<T>ні.

Я не майстер NHibernate, але я хотів кинути кісточку комусь іншому, хто міг би опинитися в цьому питанні.


Це залежить від того, як зібрано вашу колекцію. Для bagвас можна використовувати IList<T>і для набору -ISet<T>
Роман Артюхін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.