C# - NHibernate无法将NHibernate.Collection.Generic.PersistentGenericSet强制转换为System.Collections.Generic.IList

时间:2012-10-04 12:11:46

标签: c# mysql nhibernate

出于某种原因,当我尝试从数据库中获取数据时,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,而这正是我正在做的事情。

3 个答案:

答案 0 :(得分:7)

原因是你正在使用一套。 PersistentGenericSet<T>只是没有实现IList<T>接口。

我认为您应该只创建IEnumerable<Ingredient>类型的属性 这解决了两个问题:

  1. 你摆脱了你提到的错误
  2. 您班级的API直接告知您班级的消费者不允许通过该物业添加食材。

答案 1 :(得分:1)

你想要一个清单,包或套装吗?您的域模型包含IList<T>,但您已将其映射为<set>

将地图更改为<bag><list>或更改域模型以使用ISet<T>

答案 2 :(得分:1)

将属性的类型从ISet更改为IList

或更改从<set><list>的映射。