2014-11-05 119 views
0

我有一个很大的问题!在nhibernate中映射具有多个联合子类的抽象类时,我不断收到异常。 当我只使用一个联合子类时,我没有得到任何错误,一切正常。当我使用多个子类此错误occures:对象与目标类型不匹配发生异常getter

[TargetException:对象不匹配目标类型] System.Reflection.RuntimeMethodInfo.CheckConsistency(目标对象)10909543 System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(对象obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo culture)+11 System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo culture)+54 System.Reflection .RuntimePropertyInfo.GetValue(对象OBJ,的BindingFlags invokeAttr,粘结剂粘结剂,对象[]索引,CultureInfo的培养)61 System.Reflection.RuntimePropertyIn fo.GetValue(对象OBJ,对象[]索引)19 NHibernate.Properties.BasicGetter.Get(目标对象)99

[的PropertyAccessException:异常发生MedControlWeb.Models.Logs.Log.Code的吸气剂] NHibernate.Properties.BasicGetter.Get(目标对象)183 NHibernate.Engine.UnsavedValueFactory.GetUnsavedIdentifierValue(字符串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模型,ICacheConcurrencyStrategy缓存,ISessionFactoryImplementor工厂,IMapping cfg)+369 NHibernate.Impl.SessionFactoryImpl..ctor(配置cfg,IMapping映射,设置设置,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 
{   
} 

我要去哪里错了?

编辑: 我能做些什么来解决这个问题?我没有看到我可以修复它,因为我有适当的get方法?

+0

这个例外似乎很清楚。你有什么特别的困难?如果你真的需要帮助,你应该发布一个更好的代码示例。请参阅http://stackoverflow.com/help/mcve – 2014-11-05 20:29:17

+0

感谢您的回复!很抱歉,我编辑了这个问题。我没有看到我应该怎样更好地吸气。我希望你会? – 2014-11-05 21:11:43

回答

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

所以,只要保证JobLogLog子......一切都将开始工作

public class JobLog : Log

相关问题