无法将类型为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。请指导。

谢谢!


您确定要获取整数列表而不是相关实体列表吗?
莫里西奥·谢弗

Answers:


161

使用集合接口而不是具体的集合,因此NHibernate可以使用其自己的集合实现将其注入。

在这种情况下,请使用IList<int>代替List<int>


1
谢谢!解决了这个问题。当您说“ NHibernate可以使用其自己的集合实现将其注入”时,请您详细说明一下。
inutan


2
该链接不再存在。一个更新的内容或简短的内容将不胜感激。
Noich 2011年


2
我对stackoverflow上抱怨死链接的人数感到困惑。没人听说过archive.org吗?web.archive.org/web/20091105034326/http://elliottjorgensen.com/...
毛里西奥·雅伯

0

我发现ICollection<T>在哪里IList<T>没有用。

我不是NHibernate向导,但我确实想向可能会遇到此问题的其他人投掷骨头。


这取决于您的集合如何映射。供bag您使用IList<T>和设置-ISet<T>
罗马Artiukhin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.