Исключение nHibernate: невозможно привести объект типа - PullRequest
2 голосов
/ 04 февраля 2011

Я сталкиваюсь с ошибкой 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'.

Я пытаюсьвыяснить, как решить эту проблему, поэтому любая помощь будет оценена.е

1 Ответ

0 голосов
/ 05 февраля 2011

На основании вашего комментария я понимаю, что AutoMapper создает тип прокси для свойства интерфейса Specification. Таким образом, у вас есть:

public class CPUSpecification : IHardwareSpecification { }

и

public class IHardwareSpecificationProxy : IHardwareSpecification{ }

Это два несовместимых типа, и IHardwareSpecificationProxy объект не может быть преобразован в CPUSpecification.

Вам нужно указать AutoMapper использовать класс CPUSpecification вместо динамического прокси.

Edit: Учитывая, что у вас есть CPUSpecificationDTO внутри SystemTransactionDTO, вы можете достичь того, что вам нужно, с помощью следующего кода:

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

И нет необходимости изменять Specification тип свойства на CPUSpecification:).

...