nHibernate异常:无法转换类型的对象

时间:2011-02-04 19:09:38

标签: c# nhibernate object-persistence

我在保存对象时遇到了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 >

通过Save将对象持久保存到数据库时,出现以下错误:

  

异常:无法将类型为“Castle.Proxies.IHardwareSpecificationProxy”的对象强制转换为“Hardwaremarketplace.Model.SystemTransactions.CPUSpecification”。

我正在试图弄清楚如何解决这个问题,所以任何帮助都将受到赞赏。 ˚F

1 个答案:

答案 0 :(得分:0)

根据您的评论,我了解AutoMapper为接口属性Specification创建代理类型。 因此你有:

public class CPUSpecification : IHardwareSpecification { }

public class IHardwareSpecificationProxy : IHardwareSpecification{ }

这是两种不兼容的类型,IHardwareSpecificationProxy对象无法转换为CPUSpecification

您需要做的是告诉AutoMapper使用CPUSpecification类而不是动态代理。

修改 考虑到CPUSpecificationDTO内有SystemTransactionDTO,您可以使用以下代码实现所需:

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

无需将Specification属性类型更改为CPUSpecification:)。