NHibernate Exception Произошло получение идентификатора; Объект не соответствует типу цели - PullRequest
2 голосов
/ 07 декабря 2010

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

Мой Отчет класс - это основной отображаемый класс:

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();
    }
}

My 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 - это класс, который принимает универсальные типы и сериализует их для сохранения данных.

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

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 07 июля 2015

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

1 голос
/ 07 декабря 2010

try:

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

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

Обновить

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...