У меня есть класс 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.List
1 [System.Int32]“. »
Я не уверен, правильно ли я сопоставил свойство EntityIds. Пожалуйста, направьте.
Спасибо!
Ответы:
Используйте интерфейсы коллекций вместо конкретных коллекций, чтобы NHibernate мог внедрить их со своей собственной реализацией коллекции.
В этом случае используйте
IList<int>
вместоList<int>
источник
Я обнаружил, что использование
ICollection<T>
работает там, гдеIList<T>
нет.Я не волшебник NHibernate, но я действительно хотел бросить кость кому-то еще, кто может столкнуться с этой проблемой.
источник
bag
можно использоватьIList<T>
и для набора -ISet<T>