Ошибка «невозможно привести PersistentGenericSet к ISet» - PullRequest
27 голосов
/ 08 июня 2011

Я получаю эту ошибку:

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

32 голосов
/ 08 июня 2011

Ваша проблема в том, что вы используете ISet в System.Collections.Generic пространстве имен, но nHibernate ожидает, что ISet будет Iesi.Collections.Generic.ISet<>.Поэтому измените определение вашего свойства на

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

. Если вы хотите использовать интерфейс .net 4 ISet<>, просмотрите эту статью

14 голосов
/ 08 июня 2011

В последней версии NHibernate используется Iesi.Collections.ISet, а не System.Collections.Generic.ISet.Вы можете ссылаться на сборку Iesi или использовать System.Collections.Generic.ICollection:

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

Интерфейс ISet наследуется от ICollection.

4 голосов
/ 24 марта 2016

В Nhibernate 4 использование System.Collections.Generic.ISet<> теперь путь .

Ошибка, показанная в этом вопросе, больше не должна возникать.

...