2010-12-07 2 views
1

Я борюсь с подклассами сопоставления с использованием NHibernate. Я сохраняю отчеты, которые мы генерируем, и в настоящее время существует два разных типа критериев, которые я сериализую и хотел бы хранить в одной колонке (Критерии) за отчет: Основные и Время. Каждый отчет будет иметь столбец XML для критериев, которые не равны нулю. Вот мои классы:NHibernate Exception Возникший геттер Id; Объект не соответствует целевому типу

Мой Отчет класс является основным классом привязывается:

namespace Core { 
    public class Report { 
     public virtual int ReportId { get; set; } 
     public virtual string Name { get; set; } 
     public virtual ReportCriteria Criteria { get; set; } 
    } 
} 

Мои ReportCriteria класс является абстрактным и наследуется типами двух критериев:

namespace Core{ 
    [XmlRoot("Criteria"), Serializable] 
    public abstract class ReportCriteria { 
     public abstract string GenSql(); 
    } 
} 

Мой BasicCriteria класс наследует от ReportCriteria и использует метод GenSql():

namespace Core { 
    [XmlRoot("Criteria"), Serializable] 
    public class BasicCriteria : ReportCriteria { 
     public override string GenSql(){ 
      //method implementation 
     } 
    }  
} 

My TimeCriteria класс наследует от ReportCriteria и использует метод GenSql():

namespace Core { 
    [XmlRoot("Criteria"), Serializable] 
    public class TimeCriteria : ReportCriteria { 
     [Past] 
     public virtual DateTime StartDate { get; set; } 
     public virtual DateTime EndDate { get; set; } 
     public override string GenSql(){ 
      //method implementation 
     } 
    }  
} 

Наконец, мое отображение файла (Report.hbm.xml) выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping namespace="Core" assembly="Core" xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="Report" table="Report"> 
     <id name="ReportId"> 
      <generator class="identity" /> 
     </id> 
     <discriminator column="CriteriaType" /> 
     <property name="Name" /> 
     <subclass name="Core.BasicCriteria" discriminator-value="Basic"> 
      <property name="Criteria" type="Data.NHibernate.XmlSerializableType`1[[Core.BasicCriteria, Core]], Data" /> 
     </subclass> 
     <subclass name="Core.TimeCriteria" discriminator-value="Time"> 
      <property name="Criteria" type="Data.NHibernate.XmlSerializableType`1[[Core.TimeCriteria, Core]], Data" /> 
     </subclass> 
    </class> 
</hibernate-mapping> 

Data.NHibernate.XmlSerializableType - это класс, который принимает общие типы и сериализует их для сохранения данных ,

Пожалуйста, помогите мне понять, что случилось с моим отображением, которое вызывает произойти следующее сообщение об ошибке: Ex: произошло исключение добытчик Core.Report.ReportId Внутренне: объекта не соответствует цели тип.

Заранее благодарен!

ответ

1

попробовать:

<id name="ReportId" type="Int32"> 

NHibernate пытается разрешить в виде строки по умолчанию, так что вы должны сказать ему, что это целое число.

Update

Ваша основная проблема в том, что вы пытаетесь сказать, в своем отображении, что BasicCriteria и TimeCriteria являются подклассами отчета, который не так. Вам нужно пересмотреть свою стратегию сопоставления. Прошло некоторое время, так как я сделал что-то подобное, но то, о чем вы намекаете (с вашими столбцами критериев в таблице Report), является политическим отношением компонентов, которое не поддерживается. Возможно, вы захотите посмотреть UserTypes

+0

Спасибо, но на самом деле у меня есть это в моем текущем коде, и я все равно получаю ту же ошибку. Извинения: я снял эту деталь из моего выше кода, чтобы облегчить чтение. Этот вопрос определенно указывает на мои подклассы. Все работает, пока я не попытаюсь их сопоставить. – BueKoW 2010-12-07 18:19:59

1

В моем случае это было потому, что условие для получения объекта через провайдера Linq linq включало вызов метода расширения контейнера IEnumerable, когда он не был экземпляром IQueryable.Поворот коллекции в List by ToList() решил ее, потому что ICollection имеет встроенную поддержку Contains().

Смежные вопросы