2011-07-24 24 views
5
public List<Application> FindAll() 
{ 
    using (ISession NSession = SessionProvider.GetSession()) 
    { 
     ICriteria CriteriaQuery = 
      NSession.CreateCriteria(typeof(Application)); 

     return (List<Application>) CriteriaQuery.List<Application>(); 

    } 
} 

Tôi nhận được một ngoại lệ, trong đó lớp ứng dụng như sau:Không thể cast đối tượng của loại 'NHibernate.Collection.Generic.PersistentGenericBag'

public class Application 
{ 
    private string _name; 
    private Developer _developer; 
    private int _id; 
    private List<Bug> _bugs; 

    public Application() 
    { 
    } 

    public virtual int ApplicationId 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    public virtual Developer Developer 
    { 
     get { return _developer; } 
     set { _developer = value; } 
    } 

    public virtual string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 

    public virtual List<Bug> Bugs 
    { 
     get { return _bugs; } 
     set { _bugs = value; } 
    } 
} 

System.InvalidCastException: Không thể bỏ đối tượng của nhập 'NHibernate.Collection.Generic.PersistentGenericBag 1[BugTracker.Model.Bug]' to type 'System.Collections.Generic.List 1 [BugTracker.Model.Bug]'.

Đây là application.hbm.xml:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="BugTracker.Model" 
        assembly="BugTracker"> 
    <class name="Application" table="Applications" lazy="false"> 
    <id name="ApplicationId" column ="ApplicationId" type="int" unsaved-value ="0"> 
     <generator class ="native"></generator> 
    </id> 

    <property name ="Name" column="Name"/> 

    <component access ="field.camelcase-underscore" name ="Developer" 
       class="Developer"> 
     <property access ="field.camelcase-underscore" 
       column ="DeveloperFirstName" name="FirstName"/> 
     <property access ="field.camelcase-underscore" 
       column="DeveloperLastName" name="LastName"/> 
    </component> 

    <bag cascade="all-delete-orphan" 
      inverse ="true" 
      name ="Bugs" 
      lazy="false" 
      access ="field.camelcase-underscore"> 
     <key column ="ApplicationId"/> 
     <one-to-many class ="Bug"/> 
    </bag> 

    </class> 
</hibernate-mapping> 

Tôi newbie để Nhibernate và thấy nó rất phức tạp. Tôi thực sự không thể nhìn thấy vấn đề. Trường hợp ngoại lệ xảy ra ở dòng cuối cùng của Lớp Ứng dụng Constructor.

+0

ngoại lệ xảy ra tại hàm tạo của lớp ứng dụng, tại sao vậy? – FidEliO

+0

Dòng 16: { Dòng 17: _bugs = new List (); Dòng 18:} – FidEliO

+0

có thể trùng lặp của [Không thể truyền đối tượng thuộc loại NHibernate.Collection.Generic.PersistentGenericBag vào danh sách] (http://stackoverflow.com/questions/1638593/unable-to-cast-object-of-type-nhibernate-collection-generic-persistentgenericbag) –

Trả lời

3

Phương thức List<>() không trả lại List<T>, vì vậy, bạn không thể truyền nó đến List<T>.

Thay vào đó, bạn nên gọi ToList() để sao chép vào một List<Application>(). (sau đó bạn sẽ không cần một diễn viên)

+0

Vẫn không sửa chữa nó, tôi nghĩ rằng có cái gì đó sai trái trong các nhà xây dựng đó là một cách không đúng với tập tin bản đồ của tôi! – FidEliO

7

Hãy thử đặt thuộc tính Bugs của bạn là IList. Bạn cần phải làm cho nó chung chung. Trân trọng.

+0

Đây là câu trả lời hay nhất. Xem http://stackoverflow.com/questions/1638593/unable-to-cast-object-of-type-nhibernate-collection-generic-persistentgenericbag –

3

Bạn cần truyền sang IList. Nhiberante sử dụng Dependency Injection và bạn cần sử dụng các giao diện để cho phép nó thực hiện phép thuật của nó.

2

Tôi sẽ cho bạn biết một lần khác điều này xảy ra mà hầu hết mọi người đều không biết. Nếu bạn có hai cột quay lại với cùng tên nhưng thuộc một loại khác, bạn sẽ gặp sự cố này. Ví dụ, cho phép nói bạn làm một tham gia dựa trên một số id và tập hợp kết quả của bạn trông như

Id, Name, CreatedDate, Id, ExpirationDate 

nếu kiểu dữ liệu của cột Id đầu tiên là uniqueidentifier và kiểu dữ liệu của cột id thứ hai là int, bạn sẽ nhận được

Input string 'f49f503d-70d5-4fbb-8aa2-a0bd0113ff4d' was not in 
the correct format. ----> System.InvalidCastException : 

Unable to cast object of type 'System.Guid' to type 'System.IConvertible'. 

vì NHibernate sẽ trộn lẫn hai cột với cùng tên/khóa. Để giải quyết vấn đề này, chỉ cần cung cấp cho các cột của bạn các tên duy nhất qua bí danh:

select Id as IDOne, Name, CreatedDate, Id as IDTwo, ExpirationDate 
from Table1 t 
join Table2 t2 
on t.Name = t2.Name 

và điều đó sẽ giải quyết mọi vấn đề bạn có với phương thức .List().

LƯU Ý: Danh sách() không bị nhầm lẫn với Danh sách trong NHibernate. Một là gõ mạnh mẽ và khác tất nhiên là không. Danh sách cũng sẽ tự động phân tích cú pháp tập hợp kết quả cho bạn như trái ngược với việc đưa bạn trở lại một IList đã gõ sai. Trong trường hợp của tôi, tôi đang sử dụng chỉ đơn giản cũ List().

1

Thay đổi mã của bạn như:

public virtual IList<Bug> Bugs 
{ 
    get { return _bugs; } 
    set { _bugs = value; } 
} 

ý rằng Bugs là một IList<Bug> thay vì một List<Bug>.

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