2012-10-04 69 views
5

由於某些原因,NHibernate告訴我它不能將NHibernate.Collection.Generic.PersistentGenericSet[Ingredient]轉換爲System.Collection.Generic.IList[Ingredient],當我試圖從數據庫中獲取數據時數據庫。這是我的類映射/實施的一個簡化版本:NHibernate無法將NHibernate.Collection.Generic.PersistentGenericSet強制轉換爲System.Collections.Generic.IList

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

嘗試刪除新列表和ReadOnly調用的創建。 – Euphoric

+0

@Euphoric,試過了,沒有任何區別。 – rmobis

+0

@Raphael_你可以發佈你的代碼,最終工作。如果可能的話,你可以發佈「Ingredient」的代碼(或者解釋它是什麼)。我遇到了一個問題,想知道您的解決方案是否能解決問題。提前致謝。 – REMESQ

回答

7

原因是你正在使用一套。並且PersistentGenericSet<T>根本不實現IList<T>接口。

我認爲你應該簡單地使IEnumerable<Ingredient>類型的財產。
這解決了兩個問題:

  1. 你擺脫你提到
  2. 類的API直接傳達你的類的消費者都不允許通過該屬性添加成分的錯誤。
+0

我已經使它與ICollection一起工作,IEnumerable更好嗎? – rmobis

+3

@Raphael_:是的,'ICollection '仍然看起來像用戶可以通過此屬性添加項目。 'IEnumerable '相反是一個只讀接口。這就是你想要的。 –

+0

我希望能夠通過公開的方法從課堂內向課程中添加/刪除項目。 – rmobis

1

你想要一個清單,包或集?您的域模型包含IList<T>,但您已將其映射爲<set>

要麼將​​您的映射更改爲<bag><list>,要麼將您的域模型更改爲使用ISet<T>

+0

你能回顧一下你的答案嗎?我想你錯過了一些話。 – rmobis

1

將屬性更改爲ISetIList

或將映射從<set>更改爲<list>

相關問題