2012-10-04 16 views
5

Vì một số lý do, NHibernate cho tôi biết nó không thể chuyển đổi NHibernate.Collection.Generic.PersistentGenericSet[Ingredient] thành System.Collection.Generic.IList[Ingredient], khi tôi cố gắng lấy dữ liệu từ cơ sở dữ liệu. Đây là một phiên bản simplfied lập bản đồ lớp học của tôi/thực hiện:C# - NHibernate không thể truyền NHibernate.Collection.Generic.PersistentGenericSet vào 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> 

Tôi đã nhìn thấy một số câu hỏi liên quan, nhưng tất cả họ đều cho tôi biết để sử dụng IList, và đó chính xác là những gì tôi đang làm.

+0

thử xóa việc tạo danh sách mới và cuộc gọi Chỉ đọc. – Euphoric

+0

@Euphoric, đã thử, không thực sự tạo ra bất kỳ sự khác biệt nào. – rmobis

+0

@Raphael_ bạn có thể đăng mã của bạn mà cuối cùng làm việc. Và nếu có thể, bạn có thể đăng mã cho 'Thành phần' (hay giải thích nó là gì). Tôi đang chạy vào một vấn đề và đang tự hỏi liệu giải pháp của bạn sẽ sửa chữa nó. Cảm ơn trước. – REMESQ

Trả lời

7

Lý do là bạn đang sử dụng một bộ. Và PersistentGenericSet<T> chỉ đơn giản là không triển khai giao diện IList<T>.

Tôi nghĩ bạn chỉ cần tạo thuộc tính kiểu IEnumerable<Ingredient>.
này giải quyết được hai vấn đề:

  1. Bạn thoát khỏi những lỗi mà bạn đề cập
  2. API của lớp học của bạn trực tiếp truyền đạt rằng người tiêu dùng của lớp học của bạn không được phép để thêm thành phần thông qua tài sản đó.
+0

Tôi đã làm cho nó hoạt động với ICollection, IEnumerable có tốt hơn không? – rmobis

+3

@Raphael_: Có, 'ICollection ' vẫn có vẻ như người dùng có thể thêm các mục qua thuộc tính này. 'IEnumerable ' ngược lại là giao diện chỉ đọc. Đó là những gì bạn rõ ràng muốn. –

+0

Tôi muốn có thể thêm/xóa các mục vào bộ sưu tập này từ bên trong lớp học của mình, thông qua phương thức công khai. – rmobis

1

Bạn có muốn danh sách, túi hoặc bộ không? Mô hình miền của bạn chứa IList<T> nhưng bạn đã ánh xạ nó dưới dạng <set>.

Hoặc thay đổi ánh xạ của bạn thành <bag> hoặc <list> hoặc thay đổi mô hình miền của bạn để sử dụng ISet<T>.

+0

Bạn có thể xem lại câu trả lời của mình không? Tôi nghĩ bạn đã bỏ lỡ một số từ. – rmobis

1

Hoặc thay đổi loại thuộc tính thành ISet từ IList.

Hoặc thay đổi ánh xạ từ <set> thành <list>.

Các vấn đề liên quan