0

私は大きな問題を抱えています!nhibernate で抽象クラスを複数のユニオン サブクラスにマッピングすると、例外が発生し続けます。ユニオン サブクラスを 1 つだけ使用すると、エラーは発生せず、すべて正常に動作します。さらにサブクラスを使用すると、次のエラーが発生します。

[TargetException: オブジェクトがターゲット タイプと一致しません。] System.Reflection.RuntimeMethodInfo.CheckConsistency(オブジェクト ターゲット) +10909543 System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(オブジェクト obj、BindingFlags invokeAttr、バインダー バインダー、Object[] パラメーター、CultureInfo カルチャ) + 115 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder バインダー, Object[] パラメータ, CultureInfo カルチャ) +54 System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder バインダー, Object[] インデックス, CultureInfo カルチャ) +61 System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index) +19 NHibernate.Properties.BasicGetter.Get(オブジェクト ターゲット) +99

[PropertyAccessException: MedControlWeb.Models.Logs.Log.Code の getter で例外が発生しました] NHibernate.Properties.BasicGetter.Get(オブジェクト ターゲット) +183 NHibernate.Engine.UnsavedValueFactory.GetUnsavedIdentifierValue(String unsavedValue, IGetter identifierGetter, IType identifierType, ConstructorInfo constructor) +160 NHibernate.Tuple.PropertyFactory.BuildIdentifierProperty(PersistentClass MappedEntity、IIdentifierGenerator ジェネレーター) +200 NHibernate.Tuple.Entity.EntityMetamodel..ctor(PersistentClass persistentClass、ISessionFactoryImplementor sessionFactory) +775 NHibernate.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 マッピング、Settings 設定、EventListeners リスナー) +2199 NHibernate.Cfg.Configuration.BuildSessionFactory() +181ctor(構成 cfg、IMapping マッピング、設定設定、EventListeners リスナー) +2199 NHibernate.Cfg.Configuration.BuildSessionFactory() +181ctor(構成 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; }
}

サブクラスの 1 つ:

public class SettingsLog : Log
{        
}

どこが間違っていますか?

編集: このエラーを解決するにはどうすればよいですか? 適切な get メソッドがあるので、どうすれば修正できるのかわかりませんか?

4

1 に答える 1

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

于 2014-11-06T07:02:46.560 に答える