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 >

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

例外:无法将“Castle.Proxies.IHardwareSpecificationProxy”类型的对象转换为“Hardwaremarketplace.Model.SystemTransactions.CPUSpecification”类型。

我正在尝试弄清楚如何解决此问题,因此将不胜感激。F

4

1 回答 1

0

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

public class CPUSpecification : IHardwareSpecification { }

public class IHardwareSpecificationProxy : IHardwareSpecification{ }

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

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

编辑: 考虑到你有CPUSpecificationDTOinside 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 回答