Ошибка "Невозможно передать PersistentGenericSet в ISet"
Я получаю эту ошибку:
Невозможно запустить объект типа '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>
Что не так?
Ответы
Ответ 1
Ваша проблема в том, что вы используете ISet в пространстве имен System.Collections.Generic
, но nHibernate ожидает, что ISet будет Iesi.Collections.Generic.ISet<>
. Поэтому измените определение своей собственности на
public virtual Iesi.Collections.Generic.ISet<People> People { get; set; }
Если вы хотите использовать интерфейс .net 4 ISet<>
, пройдите через статью
Ответ 2
В последнем NHibernate используется Iesi.Collections.ISet, а не System.Collections.Generic.ISet. Вы можете либо ссылаться на сборку Iesi, либо использовать System.Collections.Generic.ICollection:
public virtual ICollection<People> People { get; set; }
Интерфейс ISet наследуется от ICollection.
Ответ 3
С Nhibernate 4, используя System.Collections.Generic.ISet<>
, теперь путь.
Ошибка, представленная в этом вопросе, больше не должна появляться.