出于某种原因,当我尝试从数据库中获取数据时,NHibernate告诉我它无法将NHibernate.Collection.Generic.PersistentGenericSet[Ingredient]
转换为System.Collection.Generic.IList[Ingredient]
。这是我的类映射/实现的简化版本:
public class Product {
protected Product() { };
public virtual Name { get; set; }
public virtual IList<Ingredient> {
get { return new List<Ingredient>(ingredients).AsReadOnly(); }
protected set { ingredients = value; }
}
private IList<Ingredient> ingredients = new List<Ingredient>();
}
-
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="LanchesAdmin.Core.Domain.Product, LanchesAdmin.Core" table="product" >
<id name="ID" generator="identity">
<column name="id" not-null="true" />
</id>
<property name="Name" column="name" length="64" not-null="true" />
<set name="Ingredients" table="ingredient" fetch="join" lazy="true" inverse="true">
<key column="product_id" />
<one-to-many class="LanchesAdmin.Core.Domain.Ingredient, LanchesAdmin.Core" />
</set>
</class>
</hibernate-mapping>
我已经看过几个相关的问题,但他们都告诉我使用IList,而这正是我正在做的事情。
答案 0 :(得分:7)
原因是你正在使用一套。 PersistentGenericSet<T>
只是没有实现IList<T>
接口。
我认为您应该只创建IEnumerable<Ingredient>
类型的属性
这解决了两个问题:
答案 1 :(得分:1)
你想要一个清单,包或套装吗?您的域模型包含IList<T>
,但您已将其映射为<set>
。
将地图更改为<bag>
或<list>
或更改域模型以使用ISet<T>
。
答案 2 :(得分:1)
将属性的类型从ISet
更改为IList
。
或更改从<set>
到<list>
的映射。