Невозможно привести объект типа 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);

Я получаю следующее сообщение об ошибке: «Не удается привести объект типа„NHibernate.Collection.Generic.PersistentGenericBag 1[System.Int32]' to type 'System.Collections.Generic.List1 [System.Int32]“. »

Я не уверен, правильно ли я сопоставил свойство EntityIds. Пожалуйста, направьте.

Спасибо!

инутан
источник
вы уверены, что вам нужен список целых чисел, а не список связанных сущностей?
Маурисио Схеффер

Ответы:

161

Используйте интерфейсы коллекций вместо конкретных коллекций, чтобы NHibernate мог внедрить их со своей собственной реализацией коллекции.

В этом случае используйте IList<int>вместоList<int>

Маурисио Шеффер
источник
1
Спасибо! решил вопрос. Не могли бы вы пояснить, когда вы говорите: «NHibernate может внедрить его с помощью собственной реализации коллекции».
инутан
Это объясняется здесь: surcombe.com/nhibernate-1.2/api/html/…
Маурисио Шеффер
2
Эта ссылка больше не существует. Было бы очень полезно обновить или краткое содержание.
Noich 04
2
Меня смущает количество людей в stackoverflow, которые жалуются на мертвые ссылки. Никто не слышал об archive.org? web.archive.org/web/20091105034326/http://elliottjorgensen.com/…
Маурисио Шеффер
0

Я обнаружил, что использование ICollection<T>работает там, где IList<T>нет.

Я не волшебник NHibernate, но я действительно хотел бросить кость кому-то еще, кто может столкнуться с этой проблемой.

Алекс Дреско
источник
Это зависит от того, как отображается ваша коллекция. Для bagможно использовать IList<T>и для набора -ISet<T>
Артюхин Роман