5

何らかの理由で、データベースからデータを取得しようとするとNHibernate.Collection.Generic.PersistentGenericSet[Ingredient]、NHibernateはに変換できないと言っています。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を使用するように私に言っています、そしてそれはまさに私がしていることです。

4

3 に答える 3

8

その理由は、セットを使用しているためです。そして、単にインターフェースPersistentGenericSet<T>を実装していません。IList<T>

タイプのプロパティを作成するだけでよいと思いますIEnumerable<Ingredient>
これにより、2つの問題が解決されます。

  1. あなたはあなたが言及したエラーを取り除きます
  2. クラスのAPIは、クラスのコンシューマーがそのプロパティを介して材料を追加することを許可されていないことを直接伝達します。
于 2012-10-04T12:22:28.120 に答える
1

リスト、バッグ、またはセットが必要ですか?ドメインモデルにはが含まれてIList<T>いますが、としてマッピングされています<set>

マッピングを<bag>またはに<list>変更するか、ドメインモデルを変更してを使用しISet<T>ます。

于 2012-10-04T12:22:55.617 に答える
1

プロパティのタイプをISetからに変更しIListます。

または、マッピングをから<set>に変更し<list>ます。

于 2012-10-04T12:23:14.783 に答える