2

オブジェクトの保存中に 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 >

保存を介してオブジェクトをデータベースに保存しているときに、次のエラーが発生します。

例外: タイプ 'Castle.Proxies.IHardwareSpecificationProxy' のオブジェクトをタイプ 'Hardwaremarketplace.Model.SystemTransactions.CPUSpecification' にキャストできません。

これを解決する方法を見つけようとしているので、助けていただければ幸いです。へ

4

1 に答える 1

0

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

public class CPUSpecification : IHardwareSpecification { }

public class IHardwareSpecificationProxy : IHardwareSpecification{ }

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

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

編集:CPUSpecificationDTOあなたが中にいる ことを考えるとSystemTransactionDTO、あなたは次のコードであなたが必要とするものを達成することができます:

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

Specificationまた、プロパティタイプをCPUSpecification:)に変更する必要はありません。

于 2011-02-04T22:01:31.150 に答える