2011-02-04 6 views
2

オブジェクトの保存中にnHibernateエラーが発生しました。関与nHibernate例外:タイプのオブジェクトをキャストすることができません

クラスは次のとおりです。

interface IHardwareSpecification 
{ 
    //fields and methods 
} 

public class CPUSpecification : IHardwareSpecification 
{ 
    //fields and methods 
}  

public class SystemTransaction 
{  
    //Bunch of other fields 

    private IHardwareSpecification _specs; 
    public virtual IHardwareSpecification Specification 
    { 
     get { return _specs; } 
     set { _specs = value;} 
    } 
} 

マッピング:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" ...> 
    <class name="SystemTransaction" table="SystemTransactions" lazy="false"> 
    <component access="field.camelcase-underscore" name="Specification" 
       class="HardwareMarketplace.Model.CPUSpecification"> 
     <property access="field.camelcase-underscore" column="Specification_Rate" 
       name="Rate"/> 
     ... 
    </component> 
    </class> 
</hibernate-mapping > 

保存を介してデータベースにオブジェクトを永続化する一方で、私は次のエラーを取得する:

Exception: Unable to cast object of type 'Castle.Proxies.IHardwareSpecificationProxy' to type 'Hardwaremarketplace.Model.SystemTransactions.CPUSpecification'.

Iどのようにこれを解決するかを理解しようとしているので、感謝する。 f

+0

@Diego CPUSpecificationは値オブジェクトであるため、マッピングはありません。私はIHardwareSpecificationのためのマッピングを持っていません。 – fjxx

+1

私が今まで気づいた唯一のエラーは、フィールドの名前が "_specs"ですが、マッピングの名前は "仕様"です。フィールドは、アクセス設定に従って「_指定」という名前にする必要があります。さもなければ私はあなたの問題を再現できません。もっと情報が役立つかもしれません。 – AlexD

+0

どういうわけか、エンティティを保存しようとする前に、「仕様」プロパティに「IHardwareSpecificationProxy」タイプのオブジェクトが割り当てられています。これが問題の原因です。私は、そのプロキシを作成するためのnHiberanteの理由は見ません。エンティティを保存する前に、どのようにエンティティを初期化しますか? – AlexD

答えて

0

あなたのコメントに基づいて、私はAutoMapperがインタフェースプロパティSpecificationのプロキシタイプを作成したことを理解します。 したがって、あなたは持っている:

public class CPUSpecification : IHardwareSpecification { } 

public class IHardwareSpecificationProxy : IHardwareSpecification{ } 

をこれらは互換性のない2つのタイプであり、IHardwareSpecificationProxyオブジェクトがCPUSpecificationに変換することはできません。

あなたがする必要があるのは、動的プロキシの代わりにCPUSpecificationクラスを使用するようにAutoMapperに指示することです。

編集:

Mapper.CreateMap<SystemTransactionDTO, SystemTransaction>(); 
Mapper.CreateMap<CPUSpecificationDTO, CPUSpecification>(); 
Mapper.CreateMap<CPUSpecificationDTO, IHardwareSpecification>() 
    .ConvertUsing(dto => Mapper.Map<CPUSpecificationDTO, CPUSpecification>(dto)); 

そしてCPUSpecification :)にSpecificationプロパティの種類を変更する必要はありません: はあなたがSystemTransactionDTOCPUSpecificationDTOを持って考えると、あなたは次のコードで必要なものを達成することができます。

+0

ありがとう - 私はそれを知らなかった。 Mapper.Map "CPUSpecificationDTO、IHardwareSpecification"をMapper.Map "CPUSpecificationDTO、CPUSpecification"(これはSystemTransactionクラスのSpecificationプロパティをCPUSpecification型に変更することを意味する)へのautomapperマッピングの変更を提案していますか? – fjxx

+0

私の編集された答えから分かるように、CPUSpecificationを入力するためにSpecificationプロパティを変更する必要はありません。 AutoMapperに、IHardwareSpecificationに変換するときにCPUSpecificationへの変換を使用するように指示するだけです。このアドバイスは、あなたが問題を解決するのに役立ちましたか? – AlexD

+0

はい私はこのメソッドをSystemTransactionからSystemTransactionDTOへの変換のためにマッピングしようとしました - 引数タイプIHardwareSpecificationがタイプCPUSpecificationに代入不可能であるというエラーが表示されています – fjxx

関連する問題