2014-11-05 2 views
0

У меня есть огромная проблема! Я получаю исключение при сопоставлении абстрактного класса с несколькими союзными подклассами в nhibernate. Когда я использую только один союз-подкласс, я не получаю никаких ошибок, и все работает нормально. При использовании более подклассов эта ошибка встречается,:Объект не соответствует целевому типу .. Исключено происхождение getter

[TargetException:. Объект не соответствует целевой тип] System.Reflection.RuntimeMethodInfo.CheckConsistency (целевой объект) +10909543 System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck (Object obj, BindingFlags invokeAttr, Binder binder, Object [] parameters, CultureInfo culture) +115 System.Reflection.RuntimeMethodInfo.Invoke (Object obj, BindingFlags invokeAttr, связующее связующее, Object [], культура CultureInfo) +54 System.Reflection .RuntimePropertyInfo.GetValue (Object obj, BindingFlags invokeAttr, Binder binder, Object [] index, CultureInfo culture) +61 System.Reflection.RuntimePropertyIn fo.GetValue (объект Object, Object [] индекс) +19 NHibernate.Properties.BasicGetter.Get (целевой объект) +99

[PropertyAccessException: Исключение произошло геттер из MedControlWeb.Models.Logs.Log.Code] NHibernate.Properties.BasicGetter.Get (целевой объект) +183 NHibernate.Engine.UnsavedValueFactory.GetUnsavedIdentifierValue (String unsavedValue, IGetter identifierGetter, IType identifierType, ConstructorInfo конструктор) +160 NHibernate.Tuple.PropertyFactory.BuildIdentifierProperty (PersistentClass mappedEntity, генератор IIdentifierGenerator) +200 NHibernate.Tuple.Entity.EntityMetamodel..ctor (PersistentClass persistentClass, ISessionFactoryImplementor sessionFactory) +775 NHiber nate.Persister.Entity.AbstractEntityPersister..ctor (PersistentClass persistentClass, кэш ICacheConcurrencyStrategy, ISessionFactoryImplementor завод) +835 NHibernate.Persister.Entity.UnionSubclassEntityPersister..ctor (PersistentClass persistentClass, кэш ICacheConcurrencyStrategy, ISessionFactoryImplementor завод, IMapping отображение) +220 NHibernate .Persister.PersisterFactory.CreateClassPersister (PersistentClass model, ICacheConcurrencyStrategy cache, ISessionFactoryImplementor factory, IMapping cfg) +369 NHibernate.Impl.SessionFactoryImpl..ctor (Конфигурация cfg, IMapping mapping, Настройки, прослушиватели EventListeners) +2199 NHibernate.Cfg. Configuration.BuildSessionFactory() +181

Мой HBM файл:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="MedControlWeb" 
        namespace="MedControlWeb.Models.Logs"> 

    <class name="Log" abstract="true" lazy="false"> 
    <id name="Code" column="code"> 
     <generator class="hilo"/> 
    </id> 

    <property name="Description" column="description"/> 
    <property name="User" column="user"/> 
    <property name="Timestamp" column="timestamp"/> 
    <property name="Action" column="action"/> 

    <union-subclass name="SettingsLog" table="settings_log" lazy="false"> 
    </union-subclass> 

    <union-subclass name="JobLog" table="job_log" lazy="false"> 
    </union-subclass> 

    </class> 
</hibernate-mapping> 

Мой абстрактный класс супер:

public class Log 
{ 
    public int Code { get; set; } 
    public DateTime Timestamp { get; set; } 
    public MedControlWeb.Enums.Action Action { get; set; } 
    public string Description { get; set; } 
    public int User { get; set; } 
} 

Один из подклассов:

public class SettingsLog : Log 
{   
} 

Где я буду неправильно?

Редактировать: Что можно сделать, чтобы решить эту проблему? Я не вижу, как я могу это исправить, так как у меня есть правильные методы получения?

+0

Исключение кажется довольно ясным. Что вам особенно трудно понять? Если вам действительно нужна помощь, вы должны опубликовать лучший пример кода. См. Http://stackoverflow.com/help/mcve –

+0

Спасибо за ответ! Мне жаль, я отредактировал вопрос. Я не вижу, как лучше делать геттер. Надеюсь, что да? –

ответ

0

Верьте или нет, решение здесь действительно удивительно простое.Это отображение:

<class name="Log" ... 
    ... 
    <union-subclass name="SettingsLog" table="settings_log" lazy="false"> 
    </union-subclass> 

    <union-subclass name="JobLog" table="job_log" lazy="false"> 
    </union-subclass> 

Это выше фрагмент из классаSettingsLog:

public class SettingsLog : Log // this is it, SettingsLog is also a Log 
{...} 

, который работает и наверняка, SettingsLog - это тоже Log. Вопрос сообщил, не исходит из того факта:

... получает исключение при отображении абстрактного класса с несколько союзно-подклассами ...

Но с фактом, что другой сопоставляются union-subclass не Log:

public class JobLog // this is NOT a Log.. 
{...} 

Вот почему мы можем видеть:

Исключение: объекта не соответствует целевому типу
(ну - да, потому что JobLog не Log)

Так, только гарантировать, что JobLog является подклассом Log ... все начнется работать

public class JobLog : Log

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