我在保存对象时遇到了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
答案 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
:)。