1

ヘルプを使用できるNHibernateマッピングの問題があります-ドキュメントとサンプルは私には非常に不明確に見えます。

別のクラスの辞書を含む1つのクラスがあります。正しいマッピングがわからないので、試したすべてがマッピングに失敗するか、データの読み取りでNHibernate例外が発生します。

2つのクラスは次のとおりです。

public class SnippetConfigParam
{
    public virtual int          SnippetValueKey { get; set; }
    public virtual string       ParamName { get; set; }
    public virtual string       Value{ get; set; }
}

public  class SnippetConfig
{
    public virtual int          SnippetKey { get; set; }


    public virtual ESnippetType Type{ get; set; }
    public virtual string       Name { get; set; }

    public virtual IDictionary<string, SnippetConfigParam> Params { get; set; }


    public virtual string       Description{ get; set; }


    public virtual VendorPage   Page{ get; set; }
}

私の最後のマッピングの試みは

<map name="Params"  table="SnippetConfigValue" lazy="false">
    <key column="SnippetConfigKey" />
    <index column="SnippetValueKey"  type="Int32"/>    
    <composite-element class ="SnippetConfigParam">
        <property name="ParamName"  />
        <property name="Value" />
    </composite-element>      
</map>

その結果:

System.InvalidCastException:タイプ'System.Int32'のオブジェクトをタイプ'System.String'にキャストできません。

だから私は明らかに何かを理解していません。データベーステーブルは次のとおりです。

Create Table SnippetConfig
    SnippetKey  int not null, 
    ...
    PrimaryKey( 'SnippetKey' )

  Create Table SnippetConfigValue
    SnippetValueKey  int  not null,
    ...
    PrimaryKey( 'SnippetValueKey' ),
    Key  'fk' ( 'SnippetConfigKey' ),
    Constraint 'fk' foreign key ('SnippetConfigKey' ) references 'SnippetConfig' ('SnippetKey' )...

アドバイスをいただければ幸いです。

4

1 に答える 1

1

NHibernateで辞書をマッピングするのは少し難しいかもしれません。ここで詳細な説明を参照してください:についてのAyendeの投稿<map>TKeyそれを理解するための鍵は、とTValueIDictionary<TKey, TValue>)のマッピングにあります

  • <index>TKeyは要素で表されます
  • TValueは、要素、複合要素、1対多の場合があります

あなたTKey文字列だから:

public virtual IDictionary<string, SnippetConfigParam> Params { get; set; }

それを表すマッピングをintにすることはできません

<index column="SnippetValueKey"  type="Int32"/>

Paramsプロパティをに変更すると、機能IDictionary<int, SnippetConfigParam>するはずです。

注:クラスSnippetConfigParamのプロパティSnippetValueKeyを入力する場合は、コンポーネントを拡張します

<composite-element class ="SnippetConfigParam">
    <property name="SnippetValueKey" formula="SnippetValueKey " 
              insert="false" update="false" />
    <property name="ParamName"  />
    <property name="Value" />
</composite-element>
于 2012-12-11T21:07:05.643 に答える