获取“无法将PersistentGenericSet强制转换为ISet”错误

时间:2011-06-07 23:11:19

标签: c# nhibernate automapping

我收到此错误:

  

无法投射类型的对象       'NHibernate.Collection.Generic.PersistentGenericSet 1[IocWinFormTestEntities.People]' to type 'System.Collections.Generic.ISet 1 [IocWinFormTestEntities.People]'。

实体:

public class Event 
{
    public Event()
    {
        this.People = new HashSet<People>();
    }
    public virtual Guid Id { get; private set; }

    public virtual ISet<People> People { get; set; }
}

地图覆盖类:

public class EventMapOverride : IAutoMappingOverride<Event>
{
    public void Override(AutoMapping<Event> mapping)
    {
        mapping.HasMany(c => c.People)
            .AsSet()
            .Cascade.AllDeleteOrphan();
    }
}

从流畅的自动播放器生成的hbm:

<set cascade="all-delete-orphan" name="People">
    <key>
        <column name="Event_id" />
    </key>
    <one-to-many class="IocWinFormTestEntities.People, IocWinFormTestEntities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</set>

怎么了?

3 个答案:

答案 0 :(得分:32)

您的问题是您在System.Collections.Generic命名空间中使用ISet,但nHibernate希望ISet为Iesi.Collections.Generic.ISet<>。因此,将属性定义更改为

public virtual Iesi.Collections.Generic.ISet<People> People { get; set; }

如果您想使用.net 4 ISet<>界面,请完成此article

答案 1 :(得分:14)

最新的NHibernate使用Iesi.Collections.ISet,而不是System.Collections.Generic.ISet。您可以引用Iesi程序集或使用System.Collections.Generic.ICollection:

public virtual ICollection<People> People { get; set; }

ISet接口继承自ICollection。

答案 2 :(得分:4)

使用Nhibernate 4时,使用<div id="ElementDetails"> <label id = "ElementOne">Element_1 :</label> <select id="elementOptionOne"> <label id = "ElementTwo">css Selector :</label> <select id="elementOptionTwo"> </div> 现在是the way to go

此问题中显示的错误不应再出现。