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

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

    } 
} 

私は、アプリケーションのクラスには、次のされている例外を取得しています:型のオブジェクトをキャストすることができません「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の:のオブジェクトをキャストすることができませんがタイプ 'NHibernate.Collection.Generic.PersistentGenericBag 1[BugTracker.Model.Bug]' to type 'System.Collections.Generic.List 1 [BugTracker.Model.Bug]'。ここで

は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> 

私はNHibernateのに初心者だと、それは非常に複雑見つけます。私は本当に問題を見ることができません。 例外は、アプリケーションクラスコンストラクターの最後の行で発生します。

+0

アプリケーションクラスのコンストラクタで例外が発生しますが、なぜそうですか? – FidEliO

+0

行16:{ 行17:_bugs =新しいリスト(); 18行目:} – FidEliO

+0

[NHibernate.Collection.Generic型のオブジェクトをキャストできません。PersistentGenericBagをリストに]](0120-18753)[編集] –

答えて

3

メソッドはList<T>を返さないため、List<T>にキャストできません。

代わりに、ToList()に電話してList<Application>()にコピーする必要があります。 (その後、キャストは必要ありません)

+0

まだそれを修正していない、私はそこに何か間違っていると思う私のマッピングファイルで正しくないコンストラクタです! – FidEliO

7

BugsプロパティをIListとして設定してみてください。あなたはそれを一般的にする必要があります。よろしくです。 よろしくお願いします。

+0

これは最高の答えです。 http://stackoverflow.com/questions/1638593/unable-to-cast-object-of-type-nhibernate-collection-generic-persistentgenericbagを参照してください。 –

3

IListにキャストする必要があります。 NhiberanteはDependency Injectionを使用しており、インターフェイスを使用してその魔法を実行する必要があります。

2

これは、ほとんどの人が気付いていないことが起こる別の時を伝えます。同じ名前だが異なるタイプの2つの列が戻ってきた場合、この問題が発生します。たとえば、あなたが参加し、いくつかのIDに基づいてないと最初のId列のデータ型がUNIQUEIDENTIFIERであり、第二idカラムのデータ型はintであれば、あなたの結果セットは、

Id, Name, CreatedDate, Id, ExpirationDate 

のように見えると言うことができますあなたは、彼らが同じ名前/キーを持っているようにNHibernateの2つの列をミックスしますので

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'. 

を取得するつもりです。これを解決するには、ちょうどあなたの列の別名を経由して、固有の名前を与える:

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

をし、それはあなたがの.List()メソッドを持っているすべての問題を解決する必要があります。

注記: List()はNHibernateのListと混同しないでください。 1つは強く型付けされ、もう1つはもちろん型付けされません。 Listは弱い型のIListを返すのとは対照的に、結果セットを自動的に解析します。私の場合、私は単純な古いList()を使用しています。

1
ようにコードを変更し

:バグではなくList<Bug>IList<Bug>であることを

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

注意してください。

関連する問題